Существуют ли установленные шаблоны для установки выключателя или выключателя для заданий пользователя cron?

8

У нас есть длинные сборки, которые мы обычно планируем вокруг наших заданий cron, но иногда нам приходится перезапускать сборку в нестандартный период времени, и мы можем столкнуться с конфликтами с заданиями cron, которые обычно безопасны для запуска в это время.

У нас есть несколько учетных записей, которые запускают как сборки, так и задания cron, поэтому мы не можем приостановить службу crontab для всей машины, а затем перезапустить ее позже.

Мне было интересно, есть ли у кого-то шаблон или реализация. Я думаю, что это работает как

Пользователь создает файл: ~ / block-crontab
пользователь запускает сборку. Задание cron ищет этот файл в домашнем каталоге пользователя и, если оно есть, просто пропускает все задания cron. В противном случае он запускает задания. Затем, когда сборка завершена, пользователь удаляет ~ / block-crontab.

Будет ли это работать? Я предполагаю, что мне нужно как-то изменить скрипт cron. Мне больше всего интересно, есть ли лучший / стандартный подход к этому вопросу?

Спасибо.

Шон
источник
Что вы имеете в виду [the build] can run into conflicts with from jobs that are tipically safe to run at those times? Существуют ли незавершенные задания, которые не могут быть запущены во время сборки? Все ли работы взаимоисключающие друг с другом? Или только в отношении сборки?
GnP
1
Вы смотрели вступление flockили run-one(Debian / Ubuntu)? serverfault.com/questions/82857/…
Стефан Ласевский
Например, мы запускаем большое обновление БД каждый AM. Затем каждый час до полудня мы обновляем первую полосу новостями или случайными статьями. При запуске во время обновления базы данных на первой странице могут отсутствовать некоторые элементы.
Шон
Не смотрел на стадо или беги один. Спасибо.
Шон

Ответы:

10

Вместо того, чтобы возиться с этим crond, я настоятельно рекомендую реализовать некоторую (даже простую) форму блокировки внутри ваших скриптов сборки. Например, коснитесь и проверьте наличие файла в /var/run/: если ваш скрипт что-то находит, то другой процесс создает проект. Вы, очевидно, должны удалить файл блокировки, когда закончите.

Как отметил @GnP в комментариях, вы также можете использовать flockутилиту для полуавтоматического управления вашими файлами блокировки.

Если вы не можете / не можете полагаться на какой-либо механизм блокировки, просто нажмите a, service crond stopчтобы выключить crondсистему.

shodanshok
источник
2
Команда flockбыла бы хорошим дополнением к этому ответу. Он обрабатывает файл блокировки и все мелкие детали, которые есть к нему.
GnP
@GnP Отличное предложение! Я обновил свой ответ соответственно
Shodanshok
1
Просто имейте в flockвиду, что дескриптор файла наследуется дочерними процессами, если вы не сделаете некоторый шаг, чтобы закрыть его. Иногда это может вызвать неожиданное поведение, особенно если люди запускают «фоновые задания», которые выполняются в cron.
Мэтью Ифе
1

Я склонен просто обернуть все длительные команды на экране и cronзапустить его только в том случае, если еще не запущено ни одной команды.

Так что следующая строка в crontab

*/2 * * * *  /bin/bash /path/to/LongRunningScript.bash

... превращается во что-то вроде этого:

*/2 * * * *  /usr/bin/screen -S MyUniqueName -Q select . || /usr/bin/screen -dmS MyUniqueName /bin/bash /path/to/LongRunningScript.bash

Мне это нравится, потому что он также дает вам возможность присоединиться к работающему скрипту и проверить его вывод / статус.

В вашем сценарии вы можете cronпроверить другой экран перед выполнением сборки, например

0 3 * * *  /usr/bin/screen -S ManualBuild -Q select . || /usr/bin/screen -dmS AutomatedBuild /bin/bash /path/to/BuildScripts.bash
10 3 * * *  /usr/bin/screen -S ManualBuild -Q select . || /usr/bin/screen -dmS OtherAutomatedBuild /bin/bash /path/to/OtherBuildScripts.bash

Когда вы запускаете сборку вручную, просто screenзапустите сначала, прежде чем запускать скрипт (пожалуйста, прокомментируйте, если вам нужны подсказки, как подключиться / отключиться от screen. Это полезная утилита - попробуйте, если вы еще не начали ее использовать)

Введите screen -S ManualBuild, нажмите [enter]и выполните любые команды, которые вы хотите запустить.

Примечание. Если вы используете приведенный пример, вы можете запутаться, cronесли у вас более 1 сеанса экрана с именем «ManualBuild».

транзистор
источник
Извините, только что увидел ваше примечание "для нескольких пользователей" - это не будет работать для всех пользователей без изменений. Необходимо проверить, поддерживает ли экран каким-либо образом подключение к сеансам других пользователей.
ТРС
это хорошая идея Мне бы пришлось отказаться от привычки разработчиков оставлять окна своих курсов открытыми на несколько месяцев. :)
Шон
Если они оставляют свою сессию открытой, вы можете прикрепить ее к прикрепленному экрану, используя screen -x ScreenNameи в зависимости от вашего дистрибутива (настройки suid screen), вы можете сделать сеанс экрана доступным для других пользователей. Самым чистым способом было бы запустить эти команды сборки под определенным именем пользователя, я думаю, того же пользователя, которому принадлежит задание cron.
ТРС