web-dev-qa-db-ja.com

Ubuntu 16.04のsystemdでSIGKILL / shutdownの前にSIGTERMがありません

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を送信していない の複製ではありません。質問はデスクトップアプリケーションに関するものであり、答えも当てはまりません。

1
code_onkel

systemd(以前のUbuntuバージョンではupstartとは反対)は、シャットダウン時にさらにSIGHUPを送信します(SIGKILLを送信する前に10秒ではなく90秒待機します)。 SIGHUPを無視するか、SIGTERMSIGHUPを同じ(べき等)方法で処理することをお勧めします。

変更したテストスクリプトは、次のように変更できます。

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)
3
code_onkel