Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Bash中终止进程_Bash_Shell_Kill - Fatal编程技术网

如何在Bash中终止进程

如何在Bash中终止进程,bash,shell,kill,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

我使用了以下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中终止进程?

top
发出一个需要抑制或跳过的标题

或者您可以使用
ps
,因为它的输出是高度可配置的

还要注意,
kill
接受多个PID,因此没有理由使用循环

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

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

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

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

可能这个
awk
命令没有返回任何可靠的数据,在任何情况下,有一种更简单的方法:

kill `pidof R`
或:

请尝试:

top -n 1 | awk '{print "(" $1 ") - (" $8 ")";}'
了解如何评估$1和$8

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

我通常使用:

pkill <process name>
请注意,这将杀死
R
的所有正在运行的实例,这些实例可能是您想要的,也可能不是您想要的。

您当前的目录中似乎有一个脚本
kill.sh
,它充当中介并调用
kill
内置脚本。但是,脚本将错误的参数传递给内置函数。(如果不看剧本,我无法给出细节。)

解决方案 使用
kill
内置命令,您的命令将正常工作。最简单的解决方案是确保使用bash内置的
kill
。执行:

chmod a-x kill.sh
unalias kill
unset -f kill
这将阻止脚本运行,并删除可能干扰您使用
kill
内置代码的任何别名或函数

注意。 您还可以简化命令:

kill `top -n 1 | awk '{if($8 == "R") print $1;}'`
或者。。。 您还可以使用
内置
绕过任何函数和别名:

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

top
发出一个你需要跳过的标题,
$8==“R”
在awk命令中做什么?@anubhava,检查第8个字段是否是
R
:)我想我也知道很多,但在我的OSX第8个字段是
MEM
。我认为
top
命令的输出在每个操作系统上都是不同的。@anubhava,这是GNU/Linux上的进程状态。R表示正在运行或准备运行。最好写成
。。。awk'$2==“R”{print$1}'…
(“更好”,因为它更短,而且效率更高)。@lcd047,谢谢,我不知道
awk
。这会杀死所有当前正在运行的进程吗?包括shell本身?它将杀死
R
的所有运行进程。
kill.sh
将是bash内置
kill
的调试脚本,通常位于
/usr/share/bashdb/command/kill.sh
中。不过,我不确定这个错误到底是怎么回事。对于
awk
命令,请清除对OP专有技术
$1
$8
进行评估。对于默认列,给出的命令将打印进程状态为“Running”的进程的PID。此外,错误给出了传递给kill的参数,它们似乎是PIDs。哪个发行版?例如,在我的系统上,默认列是PID USER PR NI VIRT RES SHR S%CPU%MEM TIME+命令,并且没有kill.sh的内容,不可能进行进一步的分析。Andro:(1)这与我的系统(以及OP)上的相同。“S”列是进程的状态(“R”表示“正在运行”,“S”表示“正在睡眠”,等等)。(2) 我最初以为
kill.sh
是系统的,但现在我认为它一定是OP的。我想它的别名也必须是
kill
。。。脚本显然将错误的参数传递给内置的(尽管它们看起来像有效的PID,这很奇怪)。OP的命令应该可以很好地与
kill
内置程序配合使用。因为时间太晚了,我没有像您那样清晰地思考
:p
。谢谢,修好了!
kill `top -n 1 | awk '{if($8 == "R") print $1;}'`
builtin kill `top -n 1 | awk '{if($8 == "R") print $1;}'`