Как установить 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 дня со второй строкой создания.

Другие вопросы по тегам