ответ:
0 15 * * 4 [ $(date +\%d) -le 7 ] && command
объяснение:
Прежде всего нужно осознать, что первый четверг месяцавсегда будет день месяца в наборе {1,2,3,4,5,6,7}
. Это просто потому, что в неделе всего 7 дней. Таким образом, первый четверг не может иметь день больше 7. То же самое верно и для любого другого дня недели, например, вторника или субботы.
Команда, которую выполнит cron, состоит из двух частей:
[ $(date "+\%d") -le 7 ]
: Это простой тест, который проверяет, является ли день месяца меньше 7. По сути, он проверяет, находимся ли мы в первой неделе месяца. ,Команда date -d "+%d"
возвращает день месяца в виде двузначного числа (01,02,03,...,31
) и является строкой. Команда test
, здесь написанная в альтернативной форме с квадратными скобками [ ... ]
, проверяет, не является ли целое число, полученное из date
, меньше или равно 7. Вы можете узнать больше об этом, набрав man test
в терминале.
command
: это команда, которая будет выполнена, если предыдущий test
будет успешным. Т.е. если мы в первую неделю месяца. Причина, по которой это будет выполняться только в случае успешного выполнения команды test
, заключается в &&
. Команда вида cmd1 && cmd2
выполнит cmd1
, и только тогда, когда она будет успешной, она выполнит cmd2
.
Так что, поскольку у нас теперь есть команда, мы можем теперьсоздайте наш файл 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 15 * * 4 [ $(date +\%d) -le 07 ] && command
. Вышеуказанное означает, выполнить вышеуказанную команду в минуту 0 15-го часа любого четверга. И так какКоманда содержит тест для первой недели, она будет выполняться только в первый четверг месяца.