単位ファイルなしでシステムサービスを停止する方法

単位ファイルなしでシステムサービスを停止する方法

Systemdは孤立プロセスを継承することができ、特定のサービスのユニットファイルなしでサービスを実行する他の方法があります。再起動または停止が実行されたときに、サービス定義なしでサービスの全内容が何であるかを知りたいです。

私は特に送信される信号とタイムアウトに興味があります。つまり、systemdはサービス名のアルファベット順に残りのすべてのサービスにsigtermを送信し、30秒後に残りのサービスにsigkillを発行します。 (これは正しいかどうかはわかりませんが、私が興味を持っている情報の種類はこれです。)

また、これがどこに整理され文書化されているかを知りたいです。

ベストアンサー1

ソースコードとマニュアルページを少し見てみましたが、簡単な答えは次のとおりです。

TimeoutStopSec= Configures the time to wait for stop. If a service is asked to stop, but does not terminate in the specified time, it will be terminated forcibly via SIGTERM, and after another timeout of equal duration with SIGKILL (see KillMode= in systemd.kill(5)). Takes a unit-less value in seconds, or a time span value such as "5min 20s". Pass "0" to disable the timeout logic. Defaults to DefaultTimeoutStopSec= from the manager configuration file (see systemd-system.conf(5)).

だから/etc/systemd/system.confを見て、次のことを見つけました。

#DefaultTimeoutStopSec=90s

したがって、systemd 再起動先が発生すると、systemd は自分が所有する子プロセスの pid セットを取得します。ソースコードを見ると、systemd/src/core/killall.cは次のようになります。

static int killall(int sig, Set *pids, bool send_sighup) 

systemdのすべての子プロセスのpidリストを取得し、次の方法で呼び出します。

broadcast_signal(int sig, bool wait_for_exit, bool send_sighup)

これは同じファイルにあります。したがって、pid 1のすべての子プロセスは最終的にSIGTERMの基本信号を受け取り、ユニットファイルがないとオプションのSIGHUPが送信されない可能性があり、設定されたDefaultTimeoutStopSecを待ってからSIGKILLを送信すると仮定します。

おすすめ記事