Então, estou tentando configurar um trabalho cron como uma espécie de watchdog para um daemon que eu criei. Se o daemon errar e falhar, quero que a tarefa cron o reinicie periodicamente ... Não tenho certeza de como isso é possível, mas li alguns tutoriais do cron e não consegui encontrar nada que fizesse o que eu fazia. estou procurando ...
Meu daemon é iniciado a partir de um script de shell, então estou apenas procurando uma maneira de executar um trabalho cron SOMENTE se a execução anterior desse trabalho ainda não estiver em execução.
Encontrei este post , que forneceu uma solução para o que estou tentando fazer usando arquivos de bloqueio, não sei se existe uma maneira melhor de fazê-lo ...
Obrigado pela ajuda.
grep -v grep | grep doctype.php
você pode fazergrep [d]octype.php
.&
se o cron estiver executando o script.Usar
flock
. É novo. É melhor.Agora você não precisa escrever o código sozinho. Confira mais motivos aqui: https://serverfault.com/a/82863
fonte
setlock
,s6-setlock
,chpst
, Erunlock
nos seus modos sem bloqueio são alternativas que estão disponíveis em mais do que apenas Linux. unix.stackexchange.com/a/475580/5132Como outros já declararam, escrever e verificar um arquivo PID é uma boa solução. Aqui está minha implementação do bash:
fonte
>
" versus ">>
". Me desculpe por isso.[ -e "${PIDFILE}" ]
". Se não existir , iniciará o programa em segundo plano, gravará seu PID em um arquivo ("echo $! > "${PIDFILE}"
") e Se o arquivo PID existir, o script verificará seus próprios processos ("ps -u $(whoami) -opid=
") e verificará se você está executando um com o mesmo PID ("grep -P "^\s*$(cat ${PIDFILE})$"
"). Caso contrário, ele iniciará o programa como antes, substituir o arquivo PID com o novo PID, e sair Eu não vejo nenhuma razão para modificar o script;.? vocêÉ surpreendente que ninguém tenha mencionado corrida . Eu resolvi meu problema com isso.
então adicione
run-one
antes do seu script crontabConfira esta resposta do askubuntu SE. Você também pode encontrar um link para informações detalhadas.
fonte
Não tente fazer isso via cron. Faça com que o cron execute um script, não importa o quê, e faça com que o script decida se o programa está sendo executado e inicie-o, se necessário (observe que você pode usar Ruby ou Python ou sua linguagem de script favorita para fazer isso)
fonte
Você também pode fazer isso como uma linha diretamente no seu crontab:
fonte
ps -ef|grep [c]ommand
-eq 0] && <comando>, em que a quebra da primeira letra do seu comando entre colchetes a exclui dos resultados do grep.[ "$(ps -ef|grep [c]ommand|wc -l)" -eq 0 ] && <command>
[ $(grep something | wc -l) -eq 0 ]
é uma maneira realmente indireta de escrever! grep -q something
. Então você quer simplesmenteps -ef | grep '[c]ommand' || command
grep -c
.)A maneira como faço quando estou executando scripts php é:
O crontab:
O código php:
Este comando está pesquisando na lista de processos do sistema o nome do arquivo php atual, se existir, o contador de linha (wc -l) será maior que um, porque o próprio comando de pesquisa que contém o nome do arquivo
portanto, se você estiver executando o php crons, adicione o código acima ao início do seu código php e ele será executado apenas uma vez.
fonte
Como resposta à resposta do Earlz, você precisa de um script de wrapper que crie um arquivo $ PID.running quando for iniciado e exclua quando terminar. O script do wrapper chama o script que você deseja executar. O wrapper é necessário no caso de o script de destino falhar ou ocorrer erros, o arquivo pid é excluído.
fonte
Com
lockrun
você, não é necessário escrever um script de wrapper para seu trabalho cron. http://www.unixwiz.net/tools/lockrun.htmlfonte
Eu recomendaria usar uma ferramenta existente, como o monit , ele monitorará e reiniciará automaticamente os processos. Há mais informações disponíveis aqui . Deve estar facilmente disponível na maioria das distribuições.
fonte
Este nunca me falhou:
one.sh :
trabalho cron :
fonte
ATUALIZAÇÃO .. melhor maneira de usar rebanho:
fonte
Sugiro o seguinte como uma melhoria na resposta de rsanden (eu postaria como um comentário, mas não tenho reputação suficiente ...):
Isso evita possíveis correspondências falsas (e a sobrecarga do grepping) e suprime a saída e depende apenas do status de saída do ps.
fonte
ps
comando corresponderia aos PIDs de outros usuários do sistema, não apenas dos seus. Adicionar um "-u
" aops
comando altera a maneira como o status de saída funciona.PHP personalizado simples é suficiente para alcançar. Não há necessidade de confundir com o shell script.
vamos assumir que você deseja executar o php /home/mypath/example.php se não estiver executando
Em seguida, use o seguinte script php personalizado para fazer o mesmo trabalho.
crie o seguinte /home/mypath/forever.php
Em seguida, no seu cron, adicione o seguinte
fonte
Considere usar o pgrep (se disponível) em vez do ps canalizado através do grep se você for seguir esse caminho. Embora, pessoalmente, eu tenha muita quilometragem dos scripts do formulário
Embora isso possa falhar e os trabalhos cron geralmente são a melhor maneira de coisas essenciais. Apenas outra alternativa.
fonte
Documentos: https://www.timkay.com/solo/
Exemplo
fonte