O trabalho do Upstart não morre corretamente

2

Estou criando um daemon upstart simples.

Seguindo a documentação do Upstart [1] eu faço o script conf:

description "Super Daemon" 
author "Bastian Baltasar Bux"

start on started dbus
stop on runlevel [06]

expect fork
exec /usr/bin/my-daemon

O script /usr/bin/my-daemon é um bash que chama um python. As informações de log do script python em um arquivo / var / log. Nesse script python, eu só faço um fork . Mas quando eu verifico os garfos como diz no doc do Upstart [2], o método diz que eu faço duas vezes garfos.

Com tudo isso, a tarefa de início é executada corretamente, mas o pid mostrado com upstart my-daemon status não é o mesmo que está no arquivo de log. O erro aparece quando tento parar de fazer status my-daemon stop . Esse comando não termina, devo terminar com o Crtl-C.

Eu tentei alterar o expect fork para expect daemon , mas a parada de serviço não termina nem.

Quando poderia ser o problema?

[1] link

[2] link

    
por ssoto 10.06.2013 / 14:27

1 resposta

6

Percebi que você já corrigiu o problema, corrigindo a linha exec . Para futuros leitores, vamos resumir o problema e a correção.

Problema : a execução de um python de bifurcação de um script bash do trabalho do Upstart não é rastreada corretamente.

Problema : expect fork ou expect daemon não corrige o problema.

Solução : corrija o script. Opções:

  • Mude de exec /usr/bin/my-bash-wrapper para chamar diretamente python exec python /path/to/script (conforme demonstrado nos comentários acima)

  • Corrija o script bash. Ter um script bash com conteúdo de exemplo de

#!/bin/bash

python /path/to/script

tem o problema de python ser executado separadamente do bash com um novo id de processo. Portanto, ele é ignorado pelo Upstart, já que é apenas um comando criado pelo script Bash. Adicionar expect daemon não ajuda, pois é ignorado em primeiro lugar.

O uso do script bash é possível da mesma maneira que você o corrigiu no script Upstart. Prefixar a chamada python com exec faz o python rodar com o mesmo PID do bash, que é rastreado pelo Upstart. Então expect fork pega o fork () no script Python, e o Upstart está acompanhando o processo certo.

Então, usando um wrapper bash de:

#!/bin/bash

exec python /path/to/script

faz a mesma coisa.

    
por Tuminoid 18.06.2013 / 10:12