我需要杀死某个 shell 中的所有进程,不包括某些进程。
例如,sh
这是我的 shell 和命令。
这就是我现在的 shell 中的内容。
rcihp146 :/home/msingh2> ps
PID TTY TIME COMMAND
8880 pts/258 0:00 ps
5908 pts/258 0:00 sh
但是,如果有一些额外的进程,我想杀死所有进程,不包括上述两个进程。
我为此目的尝试了一种单线,但没有成功:
rcihp146 :/home/msingh2> ps | awk '{system("kill -9 $1")}'
sh: kill: The number of parameters specified is not correct.
sh: kill: The number of parameters specified is not correct.
sh: kill: The number of parameters specified is not correct.
sh: kill: The number of parameters specified is not correct.
...但如果我只给出一个特定的 pid,如下所示,它就可以工作:
rcihp146 :/home/msingh2> ps | awk '{system("kill -9 23456")}'
我需要排除两个或三个进程(例如ps
,sh
)被杀死。
有什么办法可以做到这一点吗?
答案1
当然,您写的一行行不起作用,因为 1 美元在引号内。尝试这个:
ps| gawk '{ if ($4 != "COMMAND" && $4 != "sh" && $4 != "ps") system("kill -KILL "$1) }'
玩得开心,但要小心使用。我一般不喜欢 gawk 中的系统命令,当然更不喜欢“kill”命令。
答案2
不要解析 的输出ps
,而是根据您的喜好对其进行自定义。
如果ps
的过滤选项足以使其准确显示您要终止的进程集,则指定-o pid=
仅显示 PID 列,不显示标题行。
ps … -o pid=
1234
56789
由于输出仅包含数字和空格,因此您可以直接在命令替换中使用它:
kill $(ps … -o pid=)
如果需要进一步处理,请使用-o
选择所需的列和顺序。有关支持的列名称,请参阅ps
系统手册;POSIX指定几个。在每列后面添加=
来抑制标题行。
kill $(p=$(sh -c 'echo $PPID');
ps -o pid= -o ppid= -o tty= -o comm= |
awk -v "tty=${TTY#/dev/}" -v o=$$ -v p=$p '
$1 != o && $1 != p && $2 != p && $3 == tty && $4 != "sh" {print $1}
')
答案3
如果您需要经常执行此类操作,请安装 proctools。
pkill -v -KILL ps
杀死除 ps 以外的所有内容。