Eu escrevi um script Python que verifica um determinado endereço de email e passa novos emails para um programa externo. Como posso executar esse script 24/7, como transformá-lo em daemon ou serviço no Linux. Também precisaria de um loop que nunca termine no programa ou isso pode ser feito apenas com a execução do código várias vezes?
175
systemd
você pode criar um serviço systemd nodaemon
modo como descrito aqui . Veja também: freedesktop.org/software/systemd/man/systemd.service.htmlRespostas:
Você tem duas opções aqui.
Faça um trabalho cron apropriado que chame seu script. Cron é um nome comum para um daemon GNU / Linux que periodicamente inicia scripts de acordo com uma programação definida. Você adiciona seu script a um crontab ou coloca um link simbólico em um diretório especial e o daemon lida com o trabalho de iniciá-lo em segundo plano. Você pode ler mais na Wikipedia. Existe uma variedade de daemons cron diferentes, mas seu sistema GNU / Linux já deve ter ele instalado.
Use algum tipo de abordagem python (uma biblioteca, por exemplo) para que seu script possa se daemonizar. Sim, exigirá um loop de eventos simples (onde seus eventos são acionados por timer, possivelmente, fornecidos pela função sleep).
Eu não recomendaria que você escolha 2., porque você estaria, de fato, repetindo a funcionalidade cron. O paradigma do sistema Linux é permitir que várias ferramentas simples interajam e resolvam seus problemas. A menos que haja outras razões pelas quais você deve criar um daemon (além de ser acionado periodicamente), escolha a outra abordagem.
Além disso, se você usar daemonize com um loop e ocorrer uma falha, ninguém verificará o e-mail depois disso (como apontado por Ivan Nevostruev nos comentários a esta resposta). Embora o script seja adicionado como um trabalho cron, ele será acionado novamente.
fonte
crontab
lista? Se eu configurar isso.py
para o horário, ele criará muitos processos que nunca serão encerrados? Nesse caso, acho que isso seria muito bom.Aqui está uma aula agradável tirada daqui :
fonte
Você deve usar a biblioteca python-daemon , ela cuida de tudo.
Do PyPI: Library para implementar um processo de daemon Unix bem comportado.
fonte
Você pode usar o fork () para desanexar o script do tty e continuar com a execução, da seguinte maneira:
Claro que você também precisa implementar um loop infinito, como
Espero que você tenha começado.
fonte
nohup
/disown
desanexariam o processo do console e não morreriam. Ou você pode iniciá-lo com init.dVocê também pode fazer o script python ser executado como um serviço usando um script de shell. Primeiro, crie um shell script para executar o script python como este (scriptname arbitary name)
agora crie um arquivo em /etc/init.d/scriptname
Agora você pode iniciar e parar seu script python usando o comando /etc/init.d/scriptname start ou stop.
fonte
Uma versão simples e suportada é
Daemonize
.Instale-o no PyPI Package Index (PyPI):
e depois use como:
fonte
cron
é claramente uma ótima opção para muitos propósitos. No entanto, ele não cria um serviço ou daemon conforme solicitado no OP.cron
apenas executa trabalhos periodicamente (ou seja, o trabalho inicia e para) e não mais que uma vez / minuto. Há problemas comcron
- por exemplo, se uma instância anterior do seu script ainda estiver em execução na próxima vez que ocron
agendamento aparecer e iniciar uma nova instância, tudo bem?cron
não lida com dependências; ele apenas tenta iniciar um trabalho quando a programação exige.Se você encontrar uma situação em que realmente precisa de um daemon (um processo que nunca para de ser executado), dê uma olhada
supervisord
. Ele fornece uma maneira simples de agrupar um script ou programa normal e não daemonizado e fazê-lo operar como um daemon. Essa é uma maneira muito melhor do que criar um daemon Python nativo.fonte
que tal usar o
$nohup
comando no linux?Eu o uso para executar meus comandos no meu servidor Bluehost.
Por favor, informe se estou errado.
fonte
Se você estiver usando o terminal (ssh ou algo assim) e quiser manter um script de longa data funcionando após o logout do terminal, tente o seguinte:
screen
apt-get install screen
crie um terminal virtual dentro (abc):
screen -dmS abc
agora nos conectamos ao abc:
screen -r abc
Então, agora podemos executar o script python:
python keep_sending_mails.py
a partir de agora, você pode fechar diretamente seu terminal; no entanto, o script python continuará sendo executado em vez de ser desligado
Se você quiser voltar e verificar o status de execução do script, poderá usar
screen -r abc
novamentefonte
Primeiro, leia os aliases de email. Um alias de correio fará isso dentro do sistema de correio sem que você precise brincar com daemons ou serviços ou qualquer coisa desse tipo.
Você pode escrever um script simples que será executado pelo sendmail sempre que uma mensagem de email for enviada para uma caixa de correio específica.
Consulte http://www.feep.net/sendmail/tutorial/intro/aliases.html
Se você realmente deseja escrever um servidor desnecessariamente complexo, pode fazer isso.
Isso é tudo o que preciso. Seu script simplesmente faz um loop e dorme.
fonte
do_the_work()
pode travar o script e ninguém executá-lo novamentetry
parte falha e aexcept:
parte será chamada (nesse caso, nada), mas o loop continuará e continuará tentando chamar a função.Supondo que você realmente gostaria que seu loop fosse executado 24/7 como um serviço em segundo plano
Para uma solução que não envolve injetar seu código em bibliotecas, você pode simplesmente criar um modelo de serviço, pois está usando o linux:
Coloque esse arquivo na pasta de serviço daemon (normalmente
/etc/systemd/system/
) e instale-o usando os seguintes comandos systemctl (provavelmente exigirão privilégios de sudo):Você pode então verificar se seu serviço está sendo executado usando o comando:
fonte
Eu recomendaria esta solução. Você precisa herdar e substituir o método
run
.fonte
para criar alguma coisa que está sendo executada como serviço, você pode usar esta coisa:
A primeira coisa que você deve fazer é instalar a estrutura Cement : O trabalho de estrutura de cimento é um trabalho de estrutura de CLI que você pode implementar seu aplicativo nela.
interface de linha de comando do aplicativo:
interface.py
Classe YourApp.py:
Lembre-se de que seu aplicativo deve ser executado em um encadeamento para ser daemon
Para executar o aplicativo, basta fazer isso na linha de comando
fonte
Use qualquer gerenciador de serviços que seu sistema ofereça - por exemplo, no Ubuntu, use upstart . Isso tratará de todos os detalhes para você, como iniciar na inicialização, reiniciar na falha, etc.
fonte