システムが再起動しようとすると、プロセスはどの信号(SIGINTやSIGTERMなど)を取得できますか?

システムが再起動しようとすると、プロセスはどの信号(SIGINTやSIGTERMなど)を取得できますか?

私のアプリケーションは終了する前に何かをする必要があります。私はすでに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 *.servicesystemdはSIGTERMデフォルトでサービスの基本プロセスに1つを送信します。プロセスがTimeoutStopSec(デフォルトでは90秒)以内に終了しない場合は、それにsystemd従いますSIGKILL

アプリケーションを開発するとき、initシステムについてあまり考える必要はありません。ペアへの回答を書くのを好まないだけで維持したい場合は、そうSIGTERMすることSIGINTができます。提供するシステムサービスファイルにこのファイルが含まれていることを確認するだけですKillSignal=SIGINT

再起動時にsystemdスキップすることをお勧めするものは読みませんでした。KillSignal=閉じたときに「待機中...」と表示されると、systemd応答を待っていることを意味しますKillSignal

おすすめ記事