Existem padrões estabelecidos para instalar um interruptor de interrupção ou desativação para tarefas do cron do usuário?

8

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.

Sean
fonte
Como assim [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?
GnP 27/11
1
Você já viu uma introdução flockou run-one(Debian / Ubuntu)? serverfault.com/questions/82857/...
Stefan Lasiewski
Por exemplo, executamos uma grande atualização de banco de dados a cada AM. Então, a cada hora da tarde, atualizamos a página inicial com notícias ou itens aleatórios. Se executada durante a atualização do banco de dados, a primeira página pode ter alguns elementos ausentes.
28417 Sean
Não olhei para o rebanho ou o primeiro turno. Obrigado.
28417 Sean

Respostas:

10

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 flockutilitá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 stoppara desligar o crondsistema.

shodanshok
fonte
2
O flockcomando seria uma boa adição a esta resposta. Ele lida com o arquivo de bloqueio e com todos os pequenos detalhes que existem nele.
GnP 27/11
@GnP Excelente sugestão! Atualizei minha resposta de acordo
Shodanshok 27/11
1
Esteja ciente de que, com flocko 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.
Matthew Ife
1

Costumo apenas envolver todos os comandos de execução longa em uma tela e croncomeçar a tela apenas se ainda não houver um em execução.

Portanto, a seguinte linha crontab

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

... se transforma em algo assim:

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

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 cronprocurar outra tela antes de executar uma compilação, por exemplo

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

Quando você executa uma compilação manual, basta entrar screenprimeiro antes de executar o script (comente se precisar de dicas sobre como conectar / desconectar screen. É 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 cronse tiver mais de uma sessão de tela com o nome "ManualBuild" em execução.

trs
fonte
Desculpe, acabei de ver sua nota "entre vários usuários" - isso não funcionará entre usuários sem modificação. Precisa verificar se a tela de alguma forma suporta a conexão com as sessões de outros usuários.
trs
é uma boa ideia. Eu teria que quebrar os desenvolvedores o hábito de deixar suas janelas de vigia abertas por meses a fio. :) #
4157 Sean
Se eles deixarem a sessão aberta, você poderá anexar a uma tela anexada com screen -x ScreenNamee dependendo da sua distribuição (configurações suid para screen), 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.
trs