Stackoverflowに関する質問に答える を試みたときに、この問題に遭遇しました。
シャットダウン時に、Ubuntu 12.04はSIGTERM
をすべてのプロセスに送信し、SIGKILL
でそれらを強制終了する前に最大10秒待機します(以前に終了していない場合)。 SOに関する私の回答には、その動作を検証するPythonスクリプトも含まれています。スクリプトは端末で開始され、バックグラウンドに送信され、端末によって無視されます。 SIGTERM
を受信すると、スクリプトは実行を継続し、ファイルが実行されている時間を継続的に出力しますafter receive SIGTERM
。
ただし、Ubuntu 16.04では、シャットダウン時にすぐにスクリプトが強制終了されます(SIGTERM
は記録されません)。
しばらくグーグルで検索しましたが、役に立つものが見つかりませんでした。現在のLTSリリースでそのような重大な変更に遭遇したことはありませんか?
スクリプトは次のとおりですsignaltest.py
import signal
import time
stopped = False
out = open('log.txt', 'w')
def stop(sig, frame):
global stopped
stopped = True
out.write('caught SIGTERM\n')
out.flush()
signal.signal(signal.SIGTERM, stop)
while not stopped:
out.write('running\n')
out.flush()
time.sleep(1)
stop_time = time.time()
while True:
out.write('%.4fs after stop\n' % (time.time() - stop_time))
out.flush()
time.sleep(0.1)
スクリプトは、すべての出力に現在のディレクトリにあるlog.txt
ファイルを使用します。 1秒ごとに「実行中」を出力するループがあります。 SIGTERM
を受信するとループが壊れ、ansはSIGTERM
を受信してから経過した秒数を出力する別のループを開始します。
スクリプトは、disown
を使用して切り離されたターミナルから実行されます。
python signaltest.py &
disown
明確にする必要があります:これは、 buntuがシャットダウン時にSIGTERMを送信していない の複製ではありません。質問はデスクトップアプリケーションに関するものであり、答えも当てはまりません。
systemd(以前のUbuntuバージョンではupstartとは反対)は、シャットダウン時にさらにSIGHUPを送信します(SIGKILL
を送信する前に10秒ではなく90秒待機します)。 SIGHUP
を無視するか、SIGTERM
とSIGHUP
を同じ(べき等)方法で処理することをお勧めします。
変更したテストスクリプトは、次のように変更できます。
import signal
import time
stopped = False
out = open('log.txt', 'w')
def stop(sig, frame):
global stopped
stopped = True
out.write('caught SIGTERM\n')
out.flush()
def ignore(sig, frsma):
out.write('ignoring signal %d\n' % sig)
out.flush()
signal.signal(signal.SIGTERM, stop)
signal.signal(signal.SIGHUP, ignore)
while not stopped:
out.write('running\n')
out.flush()
time.sleep(1)
stop_time = time.time()
while True:
out.write('%.4fs after stop\n' % (time.time() - stop_time))
out.flush()
time.sleep(0.1)