自动杀死进程

自动杀死进程

我需要杀死某个 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")}'

我需要排除两个或三个进程(例如pssh)被杀死。

有什么办法可以做到这一点吗?

答案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 以外的所有内容。

相关内容