Як уберегти крон від штампування?


13

Скажіть, у мене є кілька сценаріїв, які потрібно виконувати кожні 15 хвилин. Я міг би налаштувати їх на запуск:, */15 * * * *але тоді всі вони працюють одночасно. Сервер здається дурним сидіти в режимі очікування протягом декількох хвилин, а потім раптом спробувати виконати десяток сценаріїв одночасно.

Чи є спосіб, коли я можу запустити один сценарій у хвилини 1, 16, 31, 46 та інший у 2, 17, 32, 47?

Іншими словами, я хочу, щоб кожен сценарій запускався кожні 15 хвилин, але мені байдуже, що вони виконуються спеціально на позначках чверть години.

Відповіді:


7

Ти робиш це складніше, ніж потрібно. Розташуйте їх усіх в одній лінії, розділеної крапками з комою:

*/15 * * * * command1 ; command 2 ; command 3

Він буде бігти command1, чекати, коли він закінчиться, потім запустити command2, дочекатися його закінчення тощо.


15

Якщо ви зробите свою роботу з хроном так: 6-59/15 * * * *вона працюватиме о 6, 21, 36 та 51 хвилині минулої години.

Це може не працювати з усіма версіями cron.


14

Ви можете помістити всі скрипти в каталог, скажімо /etc/cron.15m, а потім запустити cron

*/15 * * * * run-parts /etc/cron.15m

Це припускаючи, що ви маєте run-partsкоманду. Він присутній принаймні у всіх системах на базі Debian. Він запускає всі виконувані програми у названому каталозі, по одному в порядку списку.

Недоліком цього методу є те, що якщо один із скриптів висить, всі інші будуть чекати і не виконуватись. Якщо час роботи у них більше 15 хвилин, робота почнеться знову, і ви можете отримати безліч процесів.


run-partsприсутній і в системах Fedora / Red Hat.
mattdm

9

Найпростіший спосіб зробити це - просто вручну налаштувати команди, які потрібно запускати, коли ви хочете, щоб вони:

0,15,30,45 * * * * command0
1,16,31,46 * * * * command1
2,17,32,47 * * * * command2
...
14,29,44,59 * * * * command14

Або ви можете написати сценарій, щоб автоматично генерувати відповідні записи crontab (які уникають помилок друку).

Деякі версії cron (ймовірно, включаючи ту, яку ви використовуєте) приймають розширений синтаксис:

0-59/15 * * * * command0
1-59/15 * * * * command1
1-59/15 * * * * command2
...
14-59/15 * * * * command14

0

Cron не дуже хороший у тому, що ви намагаєтеся зробити. Чи розглядали ви, як написати сценарій, який діє як демон, який в основному спить 15 хвилин, виконує команду, а потім циклі?


1
З цим існує пара потенційних проблем. Одне полягає в тому, що якщо ви будете виконувати sleep 300між кожним виконанням команди, власне виконання команди призведе до того, що час буде дрейфувати; він може працювати кожні 15:10, а не кожні 15:00. І якщо фоновий процес відмирає або система перезавантажується, на відміну від цього crond, він не автоматично перезапуститься. Існують способи "демонізувати" фоновий процес, але тоді ви в значній мірі повторно реалізуєте crond.
Кіт Томпсон

Так, я погоджуюсь, що це не ідеальне рішення (хоча ти завжди можеш вирішити завдання з &), але там ти їдеш.
Метт Сіммонс

1
Натомість, просто запустіть cron єдиний скрипт, який виконує всі ваші команди по черзі. Насправді, це така загальна потреба, що існує стандартний сценарій, який називається, run-partsщо постачається з більшістю установок cron, щоб зробити це саме. Дивіться відповідь @ AndrewSchulman.
tylerl

0

У багатьох дистрибутивах є /etc/cron.d/cronhourly, для яких усі сценарії в межах працюють щогодини. Ви навіть можете вказати порядок, запустивши їх із послідовних чисел, lik 01scriptA 02scriptB - це має бути тривіально, якщо ви знаєте, що ви вже маєте виготовити "cronhourlybyfour", як ми його називаємо на базі Linux дистрибутива Smoothwall :)

Слово попередження: для цього використовуються запущені частини, як було запропоновано раніше, а запущені частини НЕ люблять сценарії з a. в імені, тому не називайте його "deletehomefolders.sh", а називайте "01deletehomefolders" і переконайтеся, що ви починаєте з потрібного #! рядок для того, що ви маєте намір інтерпретувати свій сценарій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.