Я хочу написать запись crontab для запуска каждые 30 минут в последнюю неделю каждого месяца. Я знаю, что нужно сделать последнее воскресенье, например, cron:
0 0/30 * ? * 0L
Когда я пытаюсь разделить поле дня недели запятой следующим образом:
0 0/30 * ? * 0L,1L,2L,3L,4L,5L,6L
Я получаю сообщение об ошибке:
Support for specifying 'L' with other days of the week is not implemented
Есть ли способ сократить это выражение crontab, или мне нужно сделать 7 отдельных записей crontab, каждая с разным днем?
Как говорится в сообщении об ошибке, вы не можете этого сделать. Вам нужно будет проверить сценарий, если сегодня последняя неделя месяца, и выйти / продолжить работу по мере необходимости.
#!/bin/bash
MonthDays=$(echo $(cal) | awk '{print $NF}')
Today=$(date '+%d')
let DaysLeft=MonthDays-Today
if [ $DaysLeft -gt 6 ]
then
exit 1
fi
echo "Run the rest of the script"
В качестве альтернативы вы можете использовать приведенный ниже скрипт в своем crontab - сохраните его как last-week
#!/bin/bash
MonthDays=$(echo $(cal) | awk '{print $NF}')
Today=$(date '+%d')
let DaysLeft=MonthDays-Today
if [ $DaysLeft -gt 6 ]
then
exit 1
fi
Используйте это так
0,30 * * * * last-week && your-script
Что говорит беги your-script
если last-week
скрипт завершается со статусом 0.
И если вам нужна настоящая «последняя неделя» (начиная с последнего воскресенья месяца до того, что осталось), внесите некоторые изменения в сценарий @Iain:
#!/bin/bash
Today=$(date +%d)
LastSun=$(ncal | awk 'NR==2 { print $NF }')
if [ $Today -ge $LastSun ]
then
exit 1
fi
Используйте его таким же образом.