Estou executando meu script Python em segundo plano na minha máquina Ubuntu (12.04) como esta -
nohup python testing.py > test.out &
Agora, é possível que, em algum momento, minha descrição Python script
possa morrer por qualquer motivo.
Então, eu estou pensando em ter algum tipo de cron agent
script shell bash que pode reiniciar meu script Python acima automaticamente se for morto por qualquer motivo.
Isso é possível? Se sim, qual é a melhor maneira de resolver esse tipo de problema?
ATUALIZAR:
Depois de criar o testing.conf
arquivo assim -
chdir /tekooz
exec python testing.py
respawn
Corri abaixo do comando sudo para iniciá-lo, mas não consigo ver esse processo atrasado usando o ps ax?
root@bx13:/bezook# sudo start testing
testing start/running, process 27794
root@bx13:/bezook# ps ax | grep testing.py
27806 pts/3 S+ 0:00 grep --color=auto testing.py
Alguma idéia de por que px ax não está me mostrando nada? E como verifico se meu programa está sendo executado ou não?
Este é o meu script python -
#!/usr/bin/python
while True:
print "Hello World"
time.sleep(5)
/etc/init
arquivo? Se você puder fornecer guia passo a passo para mim, então eu serei capaz de aprender algo e fazer a coisa certa ..sys.stdout = open(file_name, 'w')
no início.px ax | grep testing.py
. Não está me devolvendo nada? Alguma idéia do porquê?Você também pode adotar uma abordagem mais orientada a shell. Ter o seu
cron
olhar para o seu script e relançá-lo se ele morre.Crie um novo crontab executando
crontab -e
. Isso abrirá uma janela do seu editor de texto favorito.Adicione esta linha ao arquivo que acabou de abrir
Salve o arquivo e saia do editor.
Você acabou de criar um novo
crontab
que será executado a cada 5 minutos e iniciará seu script, a menos que ele já esteja em execução. Veja aqui um pequeno tutorial sobrecron
. Os documentos oficiais do Ubuntucron
estão aqui .O comando real
pgrep
que está sendo executado é o que procura processos em execução pela cadeia de caracteres fornecida na linha de comandos.pgrep foo
procurará um programa nomeadofoo
e retornará seu identificador de processo .pgrep -f
faz com que pesquise toda a linha de comando usada para iniciar o programa e não apenas o nome do programa (útil porque este é um script python).O
||
símbolo significa "faça isso se o comando anterior falhar". Portanto, se o seu script não estiver em execução,pgrep
ele falhará, pois não encontrará nada e seu script será iniciado.fonte
crontab -e
no diretório em que meu script python está .. Correto?cron
é um daemon de agendamento, é um serviço executado em segundo plano. Se o seu script python não estiver no seu$PATH
(se você não puder iniciá-lo em qualquer lugar, mas precisar estar em seu diretório), use o caminho completo para o script, como na minha resposta atualizada.Você pode fazer com que o programa de teste redirecione a saída usando uma opção de linha de comando e use um script python simples para reiniciar o programa indefinidamente:
você pode colocar esse programa em segundo plano e, quando quiser parar, basta puxá-lo para o primeiro plano e matá-lo.
fonte
Você realmente não deve usar isso para produção, mas pode:
Se, por qualquer motivo, o processo python sair, o loop do shell continuará e o reiniciará, acrescentando ao
.out
arquivo conforme desejado. Quase sem sobrecarga e leva muito pouco tempo para configurar.fonte
Existem várias maneiras de monitorar e reaparecer processos no UNIX / Linux. Uma das mais antigas é uma entrada "respawn" no / etc / inittab ... se você estiver usando o antigo sistema de inicialização do SysV. Outro método é usar o supervisor daemon do pacote daemontools do DJ Bernstein . Outras opções são usar os recursos do Ubuntu upstart ... ou systemd ou outros.
Mas você pode procurar alternativas init e no código Python para o Pardus: mudur daemon em particular.
Se você optar por executar uma tarefa cron (e manipulação de arquivos PID), considere ler este PEP 3143 e talvez usar sua implementação de referência.
Como mencionei em meus outros comentários, o manuseio robusto de arquivos PID é complicado. É propenso a corridas e caixas de esquina. Fica mais complicado se houver alguma chance de o seu arquivo PID terminar em um NFS ou outro sistema de arquivos em rede (parte da atomicidade garante que você obtenha a semântica de manipulação de arquivos em sistemas de arquivos UNIX / Linux locais adequados que desaparecem em algumas versões e implementações do NFS, por exemplo). Além disso, a semântica em torno do bloqueio de arquivos no UNIX pode ser complicada. (Um bloqueio
flock
oufcntl
é liberado imediatamente, no sistema operacional de destino, quando o processo que o mantém é interrompido com o SIGKILL, por exemplo?).fonte
Você também pode usar o monitoramento monit Or Process com o ps-watcher
Aqui está um exemplo para o seu cenário:
Veja exemplos de monit
fonte
Você precisa de um supervisor, pode usar o supervisor . É um supervisor baseado em python, portanto, fácil de modificar, se necessário.
O controle é com arquivos com sintaxe de arquivo .ini.
fonte
A resposta de Terdon não funcionou para mim, porque
pgrep -f testing.py
nunca 'falhou'. Ele pegaria o pid para o trabalho cron (por causa da opção -f). No entanto, sem a opção -f, o pgrep não encontrará o testing.py porque não há um processo chamado testing.py.Minha solução para isso foi mudar
para
isso significa que o trabalho completo do crontab seria:
fonte
No meu caso, como uma solução rápida, eu queria manter meu programa em execução quando ele saiu com um erro de erro ou foi morto. Por outro lado, eu queria interromper a execução quando o programa foi finalizado corretamente (código de retorno = 0)
Eu testei no Bash. Deve funcionar bem em qualquer outro shell
fonte
Para a resposta de terdon,
pgrep -f testing.py
nunca retornará falso de acordo com os comentários aqui :Para a resposta de Matt,
pgrep -f testing.py
é inútil, poispgrep python
corresponde a qualquer script Python em execução. Portanto, se o cronjob de dois scripts Python, o segundo cronjob nunca será executado.E então eu encontrei a solução para resolver
pgrep -f testing.py
no comentário aqui: https://askubuntu.com/questions/1014559/running-pgrep-in-a-crontab?noredirect=1&lq=1Meu cron para executar dois scripts Python:
fonte