PID 1以外のすべてのプロセスを終了するには?

PID 1以外のすべてのプロセスを終了するには?

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

私は現在pgrep -l . | awk "{if (\$1 != 1) print \$1}" | xargs -n 1 kill -s INT

awkPID 1を持つプロセスを除外するために使用されます。

Alpine Linux(使用)でコマンドを実行すると、次のような結果がsh得られます。

# 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

SIGTERMシグナルは呼び出しプロセスを除くすべてのプロセスに送信されます(したがって、killコマンドを実行するプロセスは組み込みkillシェル(通常はPOSIXシェルにある)、またはkillスタンドアロンコマンドを実行するプロセスかもしれません)、pidは1です。

これは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

これは、別のpidおよびmount名前空間(新しい/proc(/で使用)を使用)psからpid 1にシェルを起動しますpkillkillall

Linux の外部では、kill -- -1ほとんどのプロセスを終了するすべてのシステムで動作しますが、シャットダウンから除外されるプロセスのリストはシステムによって異なる場合があります。

答え2

できるあなた?はい。 しなければならないあなた?ほとんどすべてのケースではそうではありません。しかし:

initLinuxでは、SIGTERMを明示的に無視します。だからあなたは簡単にこれを行うことができますkillall -TERM '*'

関連情報