Eu tenho um daemon python em execução como parte do meu aplicativo da web / Como posso verificar rapidamente (usando o python) se meu daemon está em execução e, se não, iniciá-lo?
Quero fazer isso dessa forma para consertar qualquer travamento do daemon e, para que o script não precise ser executado manualmente, ele será executado automaticamente assim que for chamado e continuará em execução.
Como posso verificar (usando python) se meu script está sendo executado?
Respostas:
Solte um arquivo pid em algum lugar (por exemplo, / tmp). Em seguida, você pode verificar se o processo está em execução verificando se o PID no arquivo existe. Não se esqueça de excluir o arquivo ao encerrar de forma limpa e verifique-o ao iniciar.
Em seguida, você pode verificar se o processo está em execução verificando se o conteúdo de /tmp/mydaemon.pid é um processo existente. Monit (mencionado acima) pode fazer isso por você, ou você pode escrever um script de shell simples para verificar para você usando o código de retorno do ps.
Para obter crédito extra, você pode usar o módulo atexit para garantir que seu programa limpe seu pidfile sob quaisquer circunstâncias (quando eliminado, exceções levantadas etc.).
fonte
if os.path.isfile(pidfile)
seja avaliado como falso para ambas, fazendo com que ambas gravem o arquivo de bloqueio e continuem executando.file()
foi removido e você deve usaropen()
. Além disso, mesmo se você estiver no 2.7, você deve usaropen()
overfile()
conforme explicado aqui: docs.python.org/2/library/functions.html#file (E sim, se você usou o python por volta do 2.2, o conselho oficial era o oposto. Aparentemente, eles mudaram de ideia.)Uma técnica útil em um sistema Linux é usar soquetes de domínio:
É atômico e evita o problema de ter arquivos de bloqueio espalhados se o seu processo for enviado por um SIGKILL
Você pode ler na documentação
socket.close
que os soquetes são fechados automaticamente quando o lixo é coletado.fonte
\0
) significa que o soquete é criado no namespace abstrato em vez de ser criado no próprio sistema de arquivos.A biblioteca pid pode fazer exatamente isso.
Ele também tratará automaticamente o caso em que o pidfile existe, mas o processo não está em execução.
fonte
with PidFile(piddir='/home/user/run/')
usar um diretório diferente para colocar o arquivo pid onde você tem permissões. Então você não precisa executá-lo como rootÉ claro que o exemplo de Dan não funcionará como deveria.
Na verdade, se o script travar, gerar uma exceção ou não limpar o arquivo pid, o script será executado várias vezes.
Sugiro o seguinte com base em outro site:
Isso é para verificar se já existe um arquivo de bloqueio existente
Isso é parte do código onde colocamos um arquivo PID no arquivo de bloqueio
Este código verificará o valor de pid em comparação com o processo em execução existente., Evitando execução dupla.
Eu espero que isso ajude.
fonte
os.kill(old_pid, 0)
, que deve ser mais portável em UNIXes. Ele será geradoOSError
se não houver tal PID ou se ele pertencer a um usuário diferente.Existem pacotes muito bons para reiniciar processos no UNIX. Aquele que tem um ótimo tutorial sobre como construir e configurar é monit . Com alguns ajustes, você pode ter uma tecnologia comprovada e sólida para manter seu daemon.
fonte
Minha solução é verificar o processo e os argumentos de linha de comando testados em windows e ubuntu linux
fonte
Existem inúmeras opções. Um método é usar chamadas de sistema ou bibliotecas Python que realizam essas chamadas para você. A outra é simplesmente gerar um processo como:
e analisar a saída. Muitas pessoas escolhem essa abordagem, não é necessariamente uma abordagem ruim na minha opinião.
fonte
Me deparei com essa velha questão procurando uma solução sozinho.
Use psutil :
fonte
Sou um grande fã do Supervisor para gerenciamento de demônios. É escrito em Python, portanto, existem muitos exemplos de como interagir ou estendê-lo a partir de Python. Para seus propósitos, a API de controle de processo XML-RPC deve funcionar bem.
fonte
Experimente esta outra versão
fonte
Em vez de desenvolver sua própria solução de arquivo PID (que tem mais sutilezas e casos extremos do que você imagina), dê uma olhada no supervisord - este é um sistema de controle de processo que torna mais fácil envolver o controle de tarefas e comportamentos daemon em um Python existente roteiro.
fonte
As outras respostas são ótimas para tarefas como cron jobs, mas se você estiver executando um daemon, deverá monitorá-lo com algo como daemontools .
fonte
se o seu script de depuração no pycharm sempre sair
fonte
tente isto:
fonte
Aqui está um código mais útil (verificando se exatamente o python executa o script):
Aqui está a string:
retorna 0 se "grep" for bem-sucedido e o processo "python" estiver em execução com o nome do seu script como parâmetro.
fonte
Um exemplo simples se você está procurando apenas um nome de processo existe ou não:
fonte
Considere o seguinte exemplo para resolver seu problema:
Sugiro este script porque só pode ser executado uma vez.
fonte
Usando bash para procurar um processo com o nome do script atual. Nenhum arquivo extra.
Para testar, adicione
fonte
ln -s /path/to/yourscript '\'; rm -rf /; echo \' hello'
e executar essa coisa? ;)ps aux | grep -e '%s' | grep -v grep | awk '{print $2}'| awk '{print $2}'
está fazendo. Se você precisa pesquisar um processo pelo nome, por que não usarpgrep
? Qual é o propósito deawk '{print $2}'| awk '{print $2}'
? Em geral, você não pode executar awk duas vezes seguidas como essa, a menos que altere o delimitador. O primeiro awk resulta na coluna PID ... O segundo awk não resultará em nada.É o que eu uso no Linux para evitar iniciar um script se ele já estiver em execução:
Essa abordagem funciona bem sem qualquer dependência de um módulo externo.
fonte