Виконайте декілька завдань у галузі, де одна робота займає тривалий час


16

У мене є таке загальне запитання щодо роботи з Cron.

Припустимо, у мене є таке crontab:

* 10 * * * * someScript.sh
* 11 * * * * someScript2.sh
30 11 */2 * * someScript3.sh  <-- Takes a long time let's say 36 hours.
* 12 * * * someScript4.sh

Чи достатньо розумний, щоб виконати решту завдань у відповідний час? Наприклад, довгий сценарій не потрібно припиняти?

Крім того, що станеться, якщо початковий довгий сценарій все ще працює і він знову викликається cron?

Дякую!


Cron байдуже, як довго працюють роботи; він буде виконувати додаткові копії.
Джефф Шаллер

Переконайтеся, що ваші запитання відформатовані належним чином.
Брам

Відповіді:


31

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

Якщо будь-який із ваших сценаріїв все ще виконується в наступний запланований інтервал кронів, тоді буде виконаний інший, паралельний екземпляр вашого сценарію.

Це може мати непередбачені наслідки залежно від того, що робить ваш сценарій. Я рекомендую прочитати статтю Вікіпедії про блокування файлів , зокрема розділ про блокування файлів . Файл блокування - це простий механізм сигналізації, що ресурс - у вашому випадку someScript3.shсценарій - наразі 'заблокований' (тобто використовується) і не повинен виконуватися знову, поки файл блокування не буде видалено.

Перегляньте відповіді на наступне запитання, щоб дізнатись, як реалізувати файл блокування у вашому сценарії:


8

Не впевнений, що ви маєте на увазі під відповідний час. Cron розпочне роботу в той час, коли заплановано це зробити. Він не перевіряє інші заплановані завдання, ані інші випадки роботи.

Отже, будь-які дійсні завдання, які ви визначаєте, будуть розпочаті у визначений час. Будь-яка робота, яка триває довше визначеного інтервалу, буде запущена кілька разів. Кожен, хто написав завдання, несе відповідальність за те, щоб запобігти його дійсному виконанню кілька разів, якщо цього потрібно. Наприклад, перевіряючи файл блокування або PID-файл або щось подібне.

Існують очевидні обмеження в кількості процесів, які можуть працювати паралельно, але вони не є специфічними для хронів.


6

На додаток до інших відповідей, особливо посилання, опублікованого @soulcake: Якщо ви запланували довгу команду, що працює, із занадто коротким інтервалом, cron з радістю виконає другу, перш ніж перша завершиться (якщо тільки в команді не буде реалізована якась мютекс) .

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

Загальний спосіб запобігання полягає в умові запуску команди із захистом, який забезпечує, що попередня команда не виконується. Наприклад:

10 * * * * pgrep my_slow_command >/dev/null || /usr/local/bin/my_slow_command

Переконайтесь, що pgrep відповідає імені команди під час її запуску, наприклад, сценарії python мають python як ім'я виконуваного файлу, що, ймовірно, недостатньо конкретно, і вам також доведеться відповідати імені сценарію python.

10 * * * * pgrep -f my_script.py || /usr/local/bin/my_script.py

(pgrep без опції '-f' збігається з іменами скриптів bash)

Якщо ви не можете використовувати pgrep з якихось причин:

10 * * * * ps ax | grep [m]y_command || /usr/local/bin/my_command

Дужки використовуються, щоб уникнути відповідності самій команді grep.


0

Я використовую flock.

* * * * * exec flock --nonblock .ws_client.lock -c ws_client.py >& /tmp/ws_client.out
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.