Temos compilações demoradas que normalmente agendam nossos trabalhos cron, mas às vezes temos que executar novamente uma compilação durante um período não padrão e podemos entrar em conflito com trabalhos cron que normalmente são seguros para execução nesses momentos.
Como temos várias contas que executam tarefas de compilação e cron, não podemos suspender o serviço crontab de toda a máquina e depois reiniciá-lo mais tarde.
Fiquei me perguntando se alguém tinha um padrão ou implementação. Eu imagino isso funcionando como
O usuário cria um arquivo: ~ / block-crontab
user executa build O job cron procura esse arquivo no diretório home do usuário e, se houver, ignora todos os jobs cron. Caso contrário, ele executa os trabalhos. Quando a compilação é concluída, o usuário remove ~ / block-crontab
Isso funcionaria? Suponho que precisaria modificar o script cron de alguma forma. Estou pensando principalmente se existe uma abordagem melhor / padrão para esse problema?
obrigado.
fonte
[the build] can run into conflicts with from jobs that are tipically safe to run at those times
? Existem trabalhos que não são de construção que não podem ser executados durante a construção? Todos os trabalhos são mutuamente exclusivos? Ou apenas em relação à construção?flock
ourun-one
(Debian / Ubuntu)? serverfault.com/questions/82857/...Respostas:
Em vez de mexer com
crond
, sugiro fortemente implementar alguma forma (até simples) de bloqueio dentro de seus scripts de construção. Por exemplo, toque e verifique se há um arquivo em/var/run/
: se o seu script encontrar algo, outro processo está criando o projeto. Obviamente, você precisa remover o arquivo de bloqueio quando terminar.Como o @GnP observou nos comentários, você também pode usar o
flock
utilitário para gerenciar semi-automaticamente seus arquivos de bloqueio.Se você não pode / não pode confiar em nenhum mecanismo de bloqueio, basta emitir a
service crond stop
para desligar ocrond
sistema.fonte
flock
comando seria uma boa adição a esta resposta. Ele lida com o arquivo de bloqueio e com todos os pequenos detalhes que existem nele.flock
o descritor de arquivo, é herdado os processos filhos, a menos que você faça algum movimento para fechá-lo. Às vezes, isso pode causar comportamentos inesperados, especialmente se as pessoas iniciarem 'trabalhos em segundo plano' que são executados no cron.Costumo apenas envolver todos os comandos de execução longa em uma tela e
cron
começar a tela apenas se ainda não houver um em execução.Portanto, a seguinte linha
crontab
... se transforma em algo assim:
Eu gosto disso porque também lhe dá a chance de anexar a um script em execução e verificar sua saída / status.
No seu cenário, você pode
cron
procurar outra tela antes de executar uma compilação, por exemploQuando você executa uma compilação manual, basta entrar
screen
primeiro antes de executar o script (comente se precisar de dicas sobre como conectar / desconectarscreen
. É um utilitário útil - experimente se você ainda não começou a usá-lo)Digite
screen -S ManualBuild
, pressione[enter]
e execute os comandos que deseja executar.Nota: Se você usar o exemplo como fornecido, poderá confundir
cron
se tiver mais de uma sessão de tela com o nome "ManualBuild" em execução.fonte
screen -x ScreenName
e dependendo da sua distribuição (configurações suid parascreen
), poderá tornar uma sessão de tela compartilhável para outros usuários. A maneira mais limpa seria executar esses comandos de construção com um nome de usuário específico, eu acho, o mesmo usuário que possui o trabalho cron.