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

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

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

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

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

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

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

Спасибо.

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

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

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

Я обычно просто оборачиваю все длительные команды на экране и получаю 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».