PID 1 以外のすべてのプロセスを終了するにはどうすればよいですか?

PID 1 以外のすべてのプロセスを終了するにはどうすればよいですか?

PID 1 を除くシステム上のすべてのプロセスを終了したい。

現在使用中ですpgrep -l . | awk "{if (\$1 != 1) print \$1}" | xargs -n 1 kill -s INT

awkPID 1のプロセスを除外するために使用される

shalpine 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 シグナルを送信します。killkill

kill()これはシステム コールの一部として実行されるため、最初にプロセスを一覧表示してからそれらを強制終了するpkillkillall(または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

できるあなたは?はい。 すべきあなたは? ほとんどの場合、いいえ。 しかし:

initLinux では SIGTERM を明示的に無視します。したがって、単に と実行できますkillall -TERM '*'

関連情報