私のアプリケーションは終了する前に何かをする必要があります。私はすでにsignalを処理してctrl-cの状況を処理していますが、SIGINT
システムが再起動しようとしたときの状況も処理したいと思います。
調査の結果、SIGTERM
システムが再起動されるまで送信しないことは管理作業によって行われたことがわかりましたSIGTERM
。これは正しいですか?
私が処理できる他の信号がありますか?
編集:私のアプリケーションがによって実行されると、よりsystemd
複雑になり、処理が簡単になりますか?
ベストアンサー1
送信された信号はカスタマイズ可能で、次のように記録されます。man systemd.kill
。最も興味深い部分は次のとおりです。
KillSignal=
Specifies which signal to use when stopping a service. This
controls the signal that is sent as first step of shutting down a
unit (see above), and is usually followed by SIGKILL (see above
and below). For a list of valid signals, see signal(7). Defaults
to SIGTERM.
Note that, right after sending the signal specified in this
setting, systemd will always send SIGCONT, to ensure that even
suspended tasks can be terminated cleanly.
FinalKillSignal=
Specifies which signal to send to remaining processes after a
timeout if SendSIGKILL= is enabled. The signal configured here
should be one that is not typically caught and processed by
services (SIGTERM is not suitable). Developers can find it useful
to use this to generate a coredump to troubleshoot why a service
did not terminate upon receiving the initial SIGTERM signal. This
can be achieved by configuring LimitCORE= and setting
FinalKillSignal= to either SIGQUIT or SIGABRT. Defaults to
SIGKILL.
したがって、systemctl stop *.service
systemdはSIGTERM
デフォルトでサービスの基本プロセスに1つを送信します。プロセスがTimeoutStopSec
(デフォルトでは90秒)以内に終了しない場合は、それにsystemd
従いますSIGKILL
。
アプリケーションを開発するとき、initシステムについてあまり考える必要はありません。ペアへの回答を書くのを好まないだけで維持したい場合は、そうSIGTERM
することSIGINT
ができます。提供するシステムサービスファイルにこのファイルが含まれていることを確認するだけですKillSignal=SIGINT
。
再起動時にsystemd
スキップすることをお勧めするものは読みませんでした。KillSignal=
閉じたときに「待機中...」と表示されると、systemd
応答を待っていることを意味しますKillSignal
。