如何在Bash中杀死进程

时间:2015-05-30 05:17:15

标签: bash shell kill

我使用了以下bash代码:

for pid in `top -n 1 | awk '{if($8 == "R") print $1;}'`
do
  kill $pid
done

它说:

./kill.sh: line 3: kill: 29162: arguments must be process or job IDs
./kill.sh: line 3: kill: 29165: arguments must be process or job IDs
./kill.sh: line 3: kill: 29166: arguments must be process or job IDs
./kill.sh: line 3: kill: 29169: arguments must be process or job IDs

导致此错误的原因是什么?如何在Bash中杀死进程?

6 个答案:

答案 0 :(得分:1)

可能这个awk命令没有返回任何可靠的数据,无论如何都有一个更简单的方法:

kill `pidof R`

或者:

killall R

答案 1 :(得分:1)

似乎在您当前的目录中可能存在一个(可能是别名的)脚本kill.sh,该脚本充当中介并调用kill内置。但是,脚本将错误的参数传递给内置函数。 (我无法在不看剧本的情况下提供详细信息。)

解。

使用kill内置函数,您的命令可以正常运行。最简单的解决方案是确保使用bash builtin kill。执行:

chmod a-x kill.sh
unalias kill
unset -f kill

这将阻止脚本运行并删除任何可能会干扰您使用kill内置的别名或功能。

注意。

您还可以简化命令:

kill `top -n 1 | awk '{if($8 == "R") print $1;}'`

另外...

您还可以使用builtin绕过任何函数和别名:

builtin kill `top -n 1 | awk '{if($8 == "R") print $1;}'`

答案 2 :(得分:0)

top会发出您需要抑制或跳过的标题。

或许你可以使用ps,因为它的输出是高度可配置的。

另请注意kill接受多个PID,因此没有理由采用循环。

kill $( ps h -o pid,state | awk '$2 == "R" { print $1 }' )

答案 3 :(得分:0)

除了awk之外,sed可以在pid的列表中提供kill隔离:

kill $(ps h -o pid,state | grep R | sed -e 's/\s.*$//')

基本上,同一枚硬币的另一面。

答案 4 :(得分:0)

请尝试:

top -n 1 | awk '{print "(" $1 ") - (" $8 ")";}'

了解如何评估$ 1和$ 8

还请发布./kill.sh的内容并解释此脚本的用途

答案 5 :(得分:0)

我通常使用:

pkill <process name>

在你的情况下:

pkill R

请注意,这会终止R的所有正在运行的实例,这可能是您想要的,也可能不是。