Використання системної дати / часу в Cron Script


37

Я налаштовую Cronjob, який буде створювати резервну копію бази даних MySQL, яку я маю на своєму сервері, але я не хочу, щоб вона знову і знову перезаписувала один і той же файл. Натомість я хочу мати набір масивів резервних копій, які можна вибрати, виконаних автоматично. Наприклад:

## Cronjob, run May 21st, 2011:
mysqldump -u username -ppasword database > /path/to/file/21-03-2011.sql

## SAME Conjob, run May 28th, 2011:
mysqldump -u username -ppasword database > /path/to/file/28-03-2011.sql

І так далі.

Чи є спосіб, щоб я міг використовувати системну дату та / або час як якусь змінну у своєму Cronjob? Якщо ні, то які ваші пропозиції досягти того ж?

Відповіді:


45

Ви можете спробувати щось подібне (як зазначає Гленн Джекманн нижче, вам потрібно уникнути всіх %персонажів):

15 11 * * * touch "/tmp/$(date +\%d-\%m-\%Y).sql"

Щоб побачити, чи буде ваш конкретний cron виконувати команду з crontab як сценарій сам по собі, чи вам потрібно написати сценарій, який визначає дату як рядок, а потім виконує вашу команду mysqldump.

Не виходячи з %"cron" на Redhat Enterprise Linux 5.0 (я думаю) продовжував робити мені помилки щодо того, що не знайти відповідності ). Це тому, що все після відмітки %не надсилається на стандартний вхід команди.

Я б також рекомендував використовувати формат дат ISO8601 (yyyy-mm-dd, який є %F) для того, щоб упорядкувати імена файлів за датою при їх сортування в лексичному порядку.


23
Потрібно бути обережними з dateвнутрішнім файлом cronfile: деякі крони (усі?) Трактуються %як кінець команди. (так $()що проблема не була). Ви повинні уникати всіх знаків відсотків: ... touch "/tmp/$(date +\%Y-\%m-\%d)"(приємніше використовувати формат дати, який сортує лексикографічно)
glenn jackman

2
glenn jackman вірно: уникнення символів '%' у записі crontab вище працює. Запис crontab RHEL 5.0 виглядає приблизно так: 50 11 * * * торкніться "/tmp/backup.$(date + \% Y - \% m - \% d) .sql"
Брюс Едігер

Варто відзначити, що використання підшару не працює в змінній середовища. Отже, DATE=$( date -I )а потім ${DATE}згодом використовувати результати використання літералу $( date -I )в командному рядку завдання.
Крістофер Шульц

1
Здається, що втеча %необхідна і на OpenSuse 42.
kgadek

7

Ви повинні мати можливість використовувати date.
Введіть info dateабо man dateдеталі.

Щось подібне може вам підійти (змінити формат дати відповідно до потреб)

yourcommand > filepathandnameprefix$(date +"\%d-\%m-\%Y").extension

Знову ж таки, будьте обережні, щоб уникнути всіх %символів усередині крона.
glenn jackman

@glenn: На жаль, звичайно. Щодо лексикографічного порядку, я просто відповідав формату дати ОП. Мені особисто подобається формат ISO, як і ви.
asoundmove


1

Ось базовий сценарій, який я використав:

#!/bin/bash
mysqldump -u user1 -p DatabaseName | gzip > BackupFolder/backup`date +%F_%T`.sql.gz

Файли мають вигляд:

backup2011-03-02_15:16:46.sql.gz

Наведіть на це завдання, щоб він працював вночі або що завгодно.


Це працює як шарм. Хоча, я не зовсім розумію, що тут відбувається. Чи дозволяють бекстейки включати вихід інших програм чи щось таке? А як щодо форматування (як +% F і таке)?
AeroCross

1
Так, backticks виконує підміну команд, коли вихід заміщений на саму команду. Звертатися до розділ 3.4.5 Ось більш повний список модифікаторів посилання

О, вау, це дивовижний ресурс. Чудово завжди продовжувати вчитися. Дуже дякую за посилання!
AeroCross

0

Напишіть невеликий сценарій обгортки, який використовує dateкоманду та викликає вашу команду резервного копіювання.

#!/bin/bash
NOW=`/bin/date +"%m%d%Y-%H%M%S"`
if [[ "$?" != "0" ]]; then
 NOW="UNKNOWN_DATE"
 fi
mysqldump -u username -ppassword database > /path/to/file/$NOW.sql
if [[ "$?" != "0" ]]; then
 echo "$0: backup failed with error code $?"
 fi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.