У нас есть длинные сборки, которые мы обычно планируем вокруг наших заданий 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
? Существуют ли незавершенные задания, которые не могут быть запущены во время сборки? Все ли работы взаимоисключающие друг с другом? Или только в отношении сборки?flock
илиrun-one
(Debian / Ubuntu)? serverfault.com/questions/82857/…Ответы:
Вместо того, чтобы возиться с этим
crond
, я настоятельно рекомендую реализовать некоторую (даже простую) форму блокировки внутри ваших скриптов сборки. Например, коснитесь и проверьте наличие файла в/var/run/
: если ваш скрипт что-то находит, то другой процесс создает проект. Вы, очевидно, должны удалить файл блокировки, когда закончите.Как отметил @GnP в комментариях, вы также можете использовать
flock
утилиту для полуавтоматического управления вашими файлами блокировки.Если вы не можете / не можете полагаться на какой-либо механизм блокировки, просто нажмите a,
service crond stop
чтобы выключитьcrond
систему.источник
flock
была бы хорошим дополнением к этому ответу. Он обрабатывает файл блокировки и все мелкие детали, которые есть к нему.flock
виду, что дескриптор файла наследуется дочерними процессами, если вы не сделаете некоторый шаг, чтобы закрыть его. Иногда это может вызвать неожиданное поведение, особенно если люди запускают «фоновые задания», которые выполняются в cron.Я склонен просто обернуть все длительные команды на экране и
cron
запустить его только в том случае, если еще не запущено ни одной команды.Так что следующая строка в
crontab
... превращается во что-то вроде этого:
Мне это нравится, потому что он также дает вам возможность присоединиться к работающему скрипту и проверить его вывод / статус.
В вашем сценарии вы можете
cron
проверить другой экран перед выполнением сборки, напримерКогда вы запускаете сборку вручную, просто
screen
запустите сначала, прежде чем запускать скрипт (пожалуйста, прокомментируйте, если вам нужны подсказки, как подключиться / отключиться отscreen
. Это полезная утилита - попробуйте, если вы еще не начали ее использовать)Введите
screen -S ManualBuild
, нажмите[enter]
и выполните любые команды, которые вы хотите запустить.Примечание. Если вы используете приведенный пример, вы можете запутаться,
cron
если у вас более 1 сеанса экрана с именем «ManualBuild».источник
screen -x ScreenName
и в зависимости от вашего дистрибутива (настройки suidscreen
), вы можете сделать сеанс экрана доступным для других пользователей. Самым чистым способом было бы запустить эти команды сборки под определенным именем пользователя, я думаю, того же пользователя, которому принадлежит задание cron.