シャットダウン/クリーンアップ部分を実行せずにサービスが停止しました。

シャットダウン/クリーンアップ部分を実行せずにサービスが停止しました。

睡眠サービスです

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")

これを実行するためのUbuntu起動タスクがあります。

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

私がそうすると、

service  sleeper start
service sleeper stop

ログファイルには以下が含まれます。

going for a deep sleep.......

Finallyブロックをスキップします。クリーンアップコードが常に実行されるようにするにはどうすればよいですか? confファイルを使用して実行できますが、post stop script既存の理由でPythonファイルで実行したいと思います。

答え1

Upstart がジョブを停止するとSIGTERMシグナルを送信します。デフォルトでは、SIGTERMプログラムはすぐに終了します。これは、実行が残りのコードを介して進行せず、単に停止することを意味します。

このモジュールを使用してシグナルハンドラを実装し、signal使用方法の詳細を見つけることができます。ここ。これにより、信号を受信した後にコードを実行できます。

関連情報