
PID 1 を除くシステム上のすべてのプロセスを終了したい。
現在使用中ですpgrep -l . | awk "{if (\$1 != 1) print \$1}" | xargs -n 1 kill -s INT
。
awk
PID 1のプロセスを除外するために使用される
sh
alpine linux ( を使用)でコマンドを実行すると、次の結果が得られます。
# pgrep -l . | awk "{if (\$1 != 1) print \$1}" | xargs -n 1 kill -s INT
kill: can't kill pid 265: No such process
PID 256
は から来ていると思いますawk
。
を除くすべてのプロセスを強制終了するクリーンな方法 (ほとんどの Linux システムで使用できるユーティリティを使用) はありますかPID 1
?
答え1
少なくともLinuxでは、
kill -- -1
呼び出しプロセス (つまり、そのコマンドを実行しているプロセス (シェルが組み込まれているkill
場合はシェル (通常は POSIX シェル上) である可能性があります)、またはスタンドアロンコマンドを実行しているプロセス) と pid 1 のプロセスを除くすべてのプロセスに SIGTERM シグナルを送信します。kill
kill
kill()
これはシステム コールの一部として実行されるため、最初にプロセスを一覧表示してからそれらを強制終了するpkill
やkillall
(またはLinux で従来この目的で使用されるkillall
ことがある従来のコマンドkillall5
) などのコマンドを使用するよりも信頼性が高いことに注意してください。これらのコマンドでは、その間に生成されたプロセスが失われることになります。
まさにあなたが望んでいることのようですね。
trap '' TERM # ignore SIGTERM ourselves though it wouldn't be needed
# in most shells
kill -- -1
sleep 1 # leave processes some time to exit cleanly on SIGTERM
kill -s KILL -- -1 # removes the remaining processes or those
# that have started since without giving them
# a chance to clean-up.
exit
ID 1 のプロセス以外のすべてを強制終了する必要があります。
次のコマンドを実行して実験することができます。
unshare --mount-proc -mpf
ps
これにより、別の pid とマウント名前空間 ( / pkill
/で使用される新しい /proc を使用killall
) でシェルが起動し、そのシェルの pid は 1 になります。
Linux 以外では、kill -- -1
ほとんどのプロセスを強制終了する際にすべてのシステムで機能するはずですが、強制終了から除外されるプロセスのリストはシステムによって異なる場合があります。
答え2
できるあなたは?はい。 すべきあなたは? ほとんどの場合、いいえ。 しかし:
init
Linux では SIGTERM を明示的に無視します。したがって、単に と実行できますkillall -TERM '*'
。