【问题标题】:How to Kill Processes in Bash如何在 Bash 中杀死进程
【发布时间】:2015-05-30 05:17:14
【问题描述】:

我使用了以下 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 发出一个你需要跳过的标题
  • $8 == "R" 在 awk 命令中做了什么?
  • @anubhava,检查第 8 个字段是否为 R
  • :) 我想我也知道很多,但在我的 OSX 8th 字段上是MEM。我认为top 命令的输出因操作系统而异。
  • @anubhava,这是 GNU/Linux 上的进程状态。 R 表示正在运行或准备运行。

标签: bash shell kill


【解决方案1】:

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

kill `pidof R`

或者:

killall R

【讨论】:

  • 这会杀死所有当前正在运行的进程吗?包括外壳本身?
  • 它将杀死R的所有正在运行的进程。
【解决方案2】:

在您的当前目录中似乎有一个(可能有别名的)脚本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 绕过任何函数和别名:

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

【讨论】:

    【解决方案3】:

    请尝试:

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

    了解如何评估 $1 和 $8

    请同时贴出 ./kill.sh 的内容并说明此脚本的用途

    【讨论】:

    • 好吧,kill.sh 将是 bash 内置 kill 的调试脚本,通常位于 /usr/share/bashdb/command/kill.sh。不过,我不确定这个错误是怎么回事。至于awk 命令,请明确OP 知道如何评估$1$8。使用默认列,给出的命令将打印进程状态为“正在运行”的进程的 PID。此外,错误给出了传递给 kill 的参数,它们似乎是 PID。
    • 哪个发行版?在我的,例如默认列是 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 没有 kill.sh 的内容,就不可能进行进一步的分析
    • Alessandro:(1) 这与我的系统(和 OP)上的相同。 “S”列是进程的状态(“R”代表“正在运行”,“S”代表“睡眠”等)。 (2) 我最初认为kill.sh 是系统的,但我现在认为它一定是OP 的。我想它也必须别名为 kill... 该脚本显然将错误的参数传递给内置函数(尽管它们 看起来 像有效的 PID,这很奇怪)。 OP 的命令应该可以与 kill 内置函数一起正常工作。
    【解决方案4】:

    我通常使用:

    pkill <process name>
    

    在你的情况下:

    pkill R
    

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

    【讨论】:

      【解决方案5】:

      top 发出一个您需要抑制或跳过的标头。

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

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

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

      【讨论】:

      • 最好写成... awk '$2 == "R" { print $1 }' ...(“更好”,因为它更短,效率更高)。
      • @lcd047,谢谢,不知道awk
      【解决方案6】:

      除了awksed还可以为kill在列表中提供pid隔离:

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

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

      【讨论】:

      • 因为已经很晚了,我没有像你想的那么清楚:p。谢谢 - 已修复!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      相关资源
      最近更新 更多