Как установить cronjob на 2 дня?
Мы хотели бы использовать cronjob для создания резервной копии базы данных.
Резервное копирование должно происходить каждые два дня. Можно ли использовать следующую запись cron?
0 0 2 * * * backup-command
Если это не так, скажите, пожалуйста, правильную команду для установки cron на 2 дня.
3 ответа
Cron также поддерживает пошаговые значения.
Значение
*/2
в поле dom будет означать, что команда выполняется каждые два дня, а также,*/5
в поле часов будет означать, что команда выполняется каждые 5 часов. например* 12 10-16/2 * * root backup.sh
такой же как:
* 12 10,12,14,16 * * root backup.sh
Так что я думаю, что вы хотите 0 0 */2 * *
,
Что у тебя есть (0 0 2 * *
) будет запускать команду 2-го числа месяца в полночь каждого месяца.
ps Кажется, в вашем ответе есть лишняя звездочка. Формат должен быть:
minute hour dom month dow user cmd
Таким образом, ваша дополнительная звездочка будет в user
поле. Это предназначено?
Отказ от ответственности: это копия моего deleted
ответ здесь. Я считаю, что этот вопрос более канонический, и мой ответ здесь подходит лучше.
Существует два способа интерпретации этого вопроса.
- Я хотел бы запланировать работу cron каждый второй день месяца.
- Я хотел бы запланировать работу cron каждые два дня.
Это два совершенно разных случая из-за количества дней в месяце.
Я хотел бы запланировать cron job каждый второй день месяца.
Для этого мы используем комбинацию определения диапазона и значения шага:
man 5 crontab
: Значения шага могут использоваться вместе с диапазонами. После ряда с/<number>
Определяет пропуск значения числа через диапазон. Например,0-23/2
может использоваться в поле 'hours', чтобы указать выполнение команды для каждого второго часа (альтернатива в стандарте V7 -0,2,4,6,8,10,12,14,16,18,20,22
). Значения шага также разрешены после звездочки, поэтому если вы указываете задание, которое будет запускаться каждые два часа, вы можете использовать*/2
,
Смотрите следующие примеры:
# Example of job definition:
# .-------------------- minute (0 - 59)
# | .----------------- hour (0 - 23)
# | | .-------------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
0 0 */2 * * command1
0 0 2-31/2 * * command2
* * */2 * * command3
command1
будет выполняться в 00:00 каждого дня с нечетным номером (диапазон по умолчанию с шагом 2, т.е. 1,3,5,7,...,31)command2
будет выполняться в 00:00 каждого четного дня (т.е. 2,4,6,8,...,30)command3
это часто совершаемая ошибка. Это будет выполняться каждую минуту каждого нечетного дня.
Примечание: следует понимать, что при таком подходе command1
будет работать как 31 января, так и 1 февраля (2 дня подряд)
Примечание: следует понимать, что при таком подходе command2
пропустит 31 января и 1 февраля и будет работать только через 3 дня.
Я хотел бы запланировать cron job каждый второй день (начиная со дня X)
Здесь становится интереснее. Заметки выше уже продемонстрировали проблему с месяцами, имеющими нечетное количество дней.
Быстрый способ думать будет оценивать день года:
% date -d "2018-01-31" '+%j'
031
% date -d "2018-02-01" '+%j'
032
и вы могли бы легко выяснить, является ли это нечетное или четное число. Однако при этом у вас снова возникают проблемы 31 декабря и 1 января в обычном году (365 дней; високосные годы имеют 366 дней). Это может быть решено, если у вас есть непрерывный счетчик с данного дня. Введите метку времени UNIX, общее количество секунд с 1970-01-01 00:00:00 UTC
,
% date -d "2018-12-31" '+%s %j'
1546214400 365
% date -d "2019-01-01" '+%s %j'
1546300800 001
% date -d "2019-12-31" '+%s %j'
1577750400 365
% date -d "2020-01-01" '+%s %j'
1577836800 001
Для того, чтобы cron job бежать command4
только каждый второй день в 00:00
а также command5
каждый третий день в 00:00
начиная с "2018-03-14", crontab будет выглядеть так:
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
0 0 * * * daytestcmd 2 && command4
0 0 * * * daytestcmd 3 20180314 && command5
с daytestcmd
определяется как
#!/usr/bin/env bash
# get start time in seconds
start=$(date -d "${2:-@0}" '+%s')
# get current time in seconds
now=$(date '+%s')
# get the amount of days (86400 seconds per day)
days=$(( (now-start) /86400 ))
# set the modulo
modulo=$1
# do the test
(( days >= 0 )) && (( days % modulo == 0))
Примечание: время UNIX указано в UTC. Если ваш cron работает в другом часовом поясе, на который влияет переход на летнее время, желательно не запускать команду между 2 и 3 часами. Это может пропустить команду или выполнить команду дважды (в зависимости от того, будет ли время прыгать вперед или назад)
Примечание: время UNIX не зависит от високосных секунд
Если вы хотите использовать crontab -e
команда, попробуйте этот шаблон времени:
0 1 */2 * * command_to_execute
Или вы можете попробовать SetCronJob для веб-решения. Вы можете легко создавать задания cron каждые 2 дня со второй строкой создания.