我使用了以下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中杀死进程?
答案 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
的所有正在运行的实例,这可能是您想要的,也可能不是。