PID 1を除くシステムのすべてのプロセスを終了したいと思います。
私は現在pgrep -l . | awk "{if (\$1 != 1) print \$1}" | xargs -n 1 kill -s INT
。
awk
PID 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にシェルを起動しますpkill
。killall
Linux の外部では、kill -- -1
ほとんどのプロセスを終了するすべてのシステムで動作しますが、シャットダウンから除外されるプロセスのリストはシステムによって異なる場合があります。
答え2
できるあなた?はい。 しなければならないあなた?ほとんどすべてのケースではそうではありません。しかし:
init
Linuxでは、SIGTERMを明示的に無視します。だからあなたは簡単にこれを行うことができますkillall -TERM '*'
。