web-dev-qa-db-ja.com

systemctlがある場合とない場合のsystemdサービスの強制終了

このように実行中のデーモンsystemdサービスをkillすることの違いは何ですか?

kill -SIGKILL 3645

そして

systemctl -s kill -SIGKILL 3645

ここで、3645はsystemdサービスのPIDです。最初の方法を使用することの欠点はありますか?

4
Gordon

まず、systemctl構文が間違っています:systemctl killはPIDではなくユニット名を想定しています。-sには信号名が必要です。書かれているように、それは何もしませんがあなたにエラーメッセージを与えます:

Failed to parse signal string kill.

あなたがそれを修正すると、それはそれからあなたに言うでしょう:

Failed to kill unit 3645.service: Unit 3645.service not loaded.

正しい構文は次のとおりです。

systemctl kill -s SIGWHATEVER whatever.service

違いは明らかに、pidではなくsystemdユニットに基づいてプロセスにシグナルを送信できることです。ユニットは複数のプロセスを実行する可能性があるため、systemdは同じシグナルをユニットの下で実行されているallプロセスに送信できます。これが実際にデフォルトです。 --kill-who=オプションを使用すると、必要に応じてこれを変更できます。

ただし、一般的には、SIGKILLを何かに送信する習慣をつけることはお勧めできません。可能な限り、サービスを通常どおり停止する必要があります。 systemctl stop whatever.service。 SIGKILLは、おそらく聞いて警告されている、破壊的な可能性のあるkill -9と同じです。また、いずれかの方法でサービスを強制終了し、サービスが自動的に再起動するように構成されている場合は、再起動することがあります。これは、キル信号を送信しようとしているwhyに応じて、必要な場合とそうでない場合があります。

8
Michael Hampton