Планирование заданий в crontab с настраиваемым временем

Планирование заданий в crontab с настраиваемым временем

Может ли кто-нибудь помочь мне запланировать задание в crontab, которое будет запускаться 12-го числа каждого месяца, и если 12-е число выпадает на выходные, то оно должно запускаться в следующий понедельник.

Я нашел что-то в Интернете, но это не работает.

0 0 12 * * [ "$(date +%d -d tomorrow)" == "12" ] && [ "$(date +%u -d 12th)" -gt 5 ] && your-command

Вот что мне дал ChatGPT. Я не знаю, как это отладить

решение1

Моя общая рекомендациязаключается в том, что если вы не можете элементарно отформатировать свое расписание с помощью ограниченного синтаксиса, предоставляемого cron, вам НЕ следует пытаться создавать действительно сложную команду cron.

В качестве обходного пути: запускайте расписание (немного) чаще, чем вам нужно, а затем в пакетном задании или скрипте оболочки, где у вас гораздо более насыщенная среда, примените "сложный" логика, которая вам нужна. Если пакету разрешено выполняться, выполните задание, а в противном случае завершите работу корректно.

Пример

В cron запланируйте запуск пакета из скрипта-оболочки, который всегда запускается на 12, 13 и 14 дни, или даже разрешите ему запускаться каждый день.

# 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) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  *  command to be executed
25 4 12,13,14 * *   /path/to/your/wrapper.script
# or even: 
25 4 * * *  /path/to/your/wrapper.script

И затем в этом скрипте оболочки вы применяете логику:

  • ЕСЛИ сегодня 12-е И будний день:
    запустить задание, ИНАЧЕ завершить работу корректно

  • ЕСЛИ сегодня 13- е И понедельник:
    (тогда 12- е было воскресеньем и задание не было разрешено выполнить)
    запустить задание ИНАЧЕ завершить работу корректно

  • ЕСЛИ сегодня 14- е И понедельник:
    (тогда 12- е было субботой и задание не было разрешено выполнить)
    запустить задание ИНАЧЕ завершить работу корректно

Тогда ваш /path/to/your/wrapper.scriptbash-скрипт может выглядеть примерно так:

#!/bin/bash
# Wrapper script that will run_batch() on the 12th when 
# the 12th is a weekday, otherwise the following Monday 

run_batch () {
    # Add the real job here
    echo "The job has started"
}

TODAY=$(date +%d) 
#  date +%u     day of week (1..7); 1 is Monday
WEEKDAY=$(date +%u)  

if [ "${TODAY}" -eq 12 ] && [ "${WEEKDAY}" -le 5 ] ; then 
     run_batch
elif [ "${TODAY}" -eq  13 ] && [ "${WEEKDAY}" -eq  1 ] ; then
     run_batch
elif [ "${TODAY}" -eq 14 ] && [ "${WEEKDAY}" -eq  1 ] ; then
    run_batch
else
    exit    
fi

Связанный контент