Crontab Linux для n-й субботы месяца

#cron

#cron

Вопрос:

Мне нравится запускать резервные копии для всех будних дней, кроме субботы. Моя запись в crontab

 30 16 * * 1,2,3,4,5 ./backup.sh
  

Эта запись работает нормально.
Кроме того, я хотел бы возобновить работу в 1-ю, 3-ю субботу.
Если за месяц доступен какой-либо 5-й день, то должна быть запущена резервная копия. Какой будет запись для crontab? Я предполагаю

 30 16 1-7, 15-21, 29-31 * 6 ./backup.sh
  

Я прав?

Комментарии:

1. Добро пожаловать в StackOverflow! К сожалению, этот вопрос на самом деле не относится к StackOverflow, потому что он не имеет ничего общего с программированием. Этот вопрос относится к ServerFault .

Ответ №1:

Я прав?

Нет, вы не правы. В руководстве по crontab указано:

Примечание: День выполнения команды может быть указан в следующих двух полях: день месяца и день недели. Если оба поля ограничены (т.Е. не содержат символа «*»), команда будет запущена, когда любое из полей соответствует текущему времени. Например, 30 4 1,15 * 5 приведет к запуску команды в 4:30 утра 1 и 15 числа каждого месяца, плюс каждую пятницу.

Итак, как мы можем это сделать?

Если вы хотите определить, какая сегодня суббота месяца, то есть 1-я, 2-я или 3-я суббота месяца, все, что вам нужно сделать, это посмотреть на день недели субботы и выполнить следующее вычисление целого числа:

 D=$(date " %d")
echo $(( (D-1)/7   1 ))
  

Это значение вернет соответствующее число. Это работает не только по субботам, но и в любой будний день.

Поскольку OP хочет, чтобы cron работал в 1-ю, 3-ю и, возможно, в 5-ю субботу, фактически указано, что cron запускается в каждую субботу с нечетным номером:

 D=$(date " %d")
echo $(( ((D-1)/7   1) % 2 ))
  

Использование этого в качестве дополнительного теста позволяет нам записать cron как:

 # 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

 30 16  *  *  6   (( (($(date " %d") - 1)/7   1) % 2 == 1 )) amp;amp; command