cronjobs: запускать каждый день, «кроме», когда выполняется еженедельно / ежемесячно / ежегодно. - PullRequest
1 голос
/ 27 мая 2020

У меня сейчас есть это, чтобы всегда работать в 6 часов. Один раз.

0 6 * * 1-6 server.sh backup  daily  # Run Monday-Saturday
0 6 * * 0 server.sh backup weekly    # Run every Sunday

И они иногда будут сталкиваться из-за того, как работает время:

0 6 1 2-12 * server.sh backup  monthly # Run 1st day of month (feb-dec)
0 6 1 1 *  server.sh backup   yearly # Run 1st of January

Я ранее сдвигал время на еженедельное / ежемесячное / ежегодное, чтобы они никогда не работали в в то же время. Я надеюсь, что есть простой способ с помощью cronjob работать на 6 каждый день и сортировать ежедневно / еженедельно / ежемесячно / ежегодно

Год должен иметь присутствие над месяцем, неделей и днем, месяцем за неделей и днем.

1 Ответ

0 голосов
/ 27 мая 2020

Для ежедневных и еженедельных заданий вы можете проверить, является ли день месяца 1, и запускать только в том случае, если это не так:

0 6 * * 1-6 [ "$(date '+%%-d')" -ne 1 ] && server.sh backup daily   # Run Monday-Saturday
0 6 * * 0   [ "$(date '+%%-d')" -ne 1 ] && server.sh backup weekly  # Run every Sunday

Директива форматирования +%%-d - "день месяца, без нулевого заполнения ».

%% необходимо удвоить, иначе cron интерпретирует его как символ новой строки.

Некоторые версии date не поддерживают -, чтобы удалить нулевое заполнение, и на самом деле это не требуется, потому что [ 01 -eq 1 ] истинно (но [ 01 = 1 ] нет!), Но это чище.

...