Использование системной даты / времени в 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 (гггг-мм-дд, то есть %F), чтобы при сортировке лексически сортировать имена файлов по дате.


23
dateНужно быть осторожным с внутренним файлом: некоторые кроны (все?) Считаются %концом команды. (так $()что проблема не была). Вы должны избежать всех знаков процента: ... touch "/tmp/$(date +\%Y-\%m-\%d)"(лучше использовать формат даты, который сортирует лексикографически)
Гленн Джекман

2
Гленн Джекман прав: экранирование символов «%» в записи crontab выше работает. Запись в crontab RHEL 5.0 выглядит следующим образом: 50 11 * * * touch "/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

Опять же, будьте осторожны, чтобы избежать всех %символов внутри cron.
Гленн Джекман

@glenn: Ой, конечно. Что касается лексикографического порядка, я просто соответствовал формату даты ОП. Мне лично нравится формат ISO, как и вы.
asoundmove


1

Вот скрипт bash, который я использовал:

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

Файлы выглядят так:

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

Направьте работу cron на это, чтобы бегать по ночам или как угодно.


Это работает как шарм. Хотя я не совсем понимаю, что здесь происходит. Позволяет ли обратная галочка включать вывод других программ или что-то? Как насчет форматирования (например, +% F и тому подобное)?
AeroCross

1
Да, обратные пометки выполняют подстановку команд, где вывод заменяет саму команду. Обратитесь к разделу 3.4.5. Вот более полный список модификаторов для канала

О, это удивительный ресурс. Здорово всегда продолжать учиться. Большое спасибо за ссылку!
АэроКросс

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.