service stop não executa a parte de saída / limpeza

1

Este é um serviço para dormir,

import time
bufsize = 0
f = open("/home/user/sleep-log", "w", bufsize)
try:
  f.write("going for a deep sleep......")
  time.sleep( 1000000000)
except:
  import traceback; f.write(traceback.format_exc())
finally:
  f.write("that is surprising.. final block just ran")

E eu tenho uma tarefa de upstart do Ubuntu para rodar isso,

description "sleeper"
author "saravana"
start on runlevel [2345]
stop on runlevel [!2345]
script
  exec /usr/bin/python /home/user/a.py
end script

Quando eu faço,

service  sleeper start
service sleeper stop

o arquivo de log contém,

going for a deep sleep.......
O bloco

Finally é ignorado. Como posso garantir que meu código de limpeza será sempre executado? Eu posso fazer isso no arquivo conf usando post stop script , mas por razões de legado, eu quero fazê-lo dentro do arquivo python.

    
por Madhavan Kumar 28.07.2015 / 15:27

1 resposta

1

Quando o Upstart interrompe um trabalho, ele envia o sinal SIGTERM . Por padrão, SIGTERM faz com que o programa saia imediatamente. Isso significa que a execução não flui pelo resto do código, simplesmente pára.

Um manipulador de sinal pode ser implementado usando o módulo signal , você pode encontrar detalhes sobre seu uso aqui . Isso permitirá que você execute o código ao receber o sinal.

    
por 28.07.2015 / 16:58