Назад | Перейти на главную страницу

Обозначение выражения Cron

Я хочу написать запись 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

Используйте его таким же образом.