【问题标题】:Kill command erroring out杀死命令出错
【发布时间】:2016-06-27 07:56:16
【问题描述】:

我们有一个脚本可以获取所有活动进程并杀死它。 但由于某种原因,我收到以下错误:

:: 信息:: /AA/AAA/AAA/AAA/AAA/AAA/AAA/AAA\ Servers.sh :: 2016-06-26:04:00:04 :强制杀死剩余的服务器 过程

:: 信息:: /AA/AAA/AAA/AAA/AAA/AAA/AAA/AAA\ Servers.sh :: 2016-06-26:04:00:04 :force_stop_managed_servers 称为kill: 用法\ : kill [-s sigspec | -n 符号 | -sigspec] pid | jobspec ... 或 kill -l [sigspe\ c]

我的脚本具有以下强制终止进程的功能。

function force_stop_managed_servers () {

        printf "\n\n:: INFO :: $0 :: `date +%Y-%m-%d:%H:%M:%S` :force_stop_managed_servers called"
        cd $SCRIPT_DIR
        kill -9 $(ps -ef | grep SONARPOTY | grep $USER | grep -v "grep" | grep -v "StopManagedServers" | grep -v "controller"| awk '{ print $2 }')
        printf "\n\n:: INFO :: $0 :: `date +%Y-%m-%d:%H:%M:%S` :force_stop_managed_servers done"
}

请告诉我为什么会出现此错误。

【问题讨论】:

  • set -x 试试,你可能会发现kill 被错误地调用了。 (另外,shellcheck.net 会显示您还有其他一些潜在的错误。)
  • 确认$USER是否不为空,并且big命令返回的pid是否只有一个。
  • @Fazlin:长命令不会返回单个进程 ID。它将返回多个进程。如果它返回多个进程,您能否建议它的缺点是什么以及克服该问题的可能解决方案?
  • 我不想使用 for 循环,因为 for 循环会一一杀死进程,并且一旦我获取列表并一一杀死它们,进程可能会得到完成,然后 kill 命令将出错,告诉 No such process.
  • @Fazlin :它确实适用于多个 PID。正如我上面提到的,for 循环具有上述缺点。此外,这个问题是间歇性的。它并不总是来。有时我会看到这个问题,否则它可以正常工作。所以问题是我遇到这个问题的边缘情况。

标签: shell kill-process


【解决方案1】:

如果不带参数调用“kill -9”命令,则可能出现此错误。您可以执行长行命令并将输出分配给变量。稍后检查该变量是否为空并将该变量作为参数传递给 kill 命令。

【讨论】:

    【解决方案2】:

    procps 包比util-linux-ng 包结合grep 具有更好的处理进程选择和向选定进程发送信号的能力。

    看到使用grep 从进程列表中选择进程ID 的脚本是很常见的。

    ps -ef | grep pattern | grep -v grep | awk '{print $2}'
    

    但是,这可以缩短为:

    pgrep pattern
    

    这两种情况都将打印名称为pattern 的进程的PID。 但是有一个警告,第二个版本仅将模式与进程名称匹配。 如果你需要匹配命令参数,你需要类似:

    pgrep -f pattern
    

    限制搜索用户拥有的进程。对grep 用户名的一些尝试。 pgrepps 都接受 -u username 以仅列出用户名拥有的进程。

    而不是写:

    ps -ef | grep username | grep -v grep | awk '{print $2}'
    

    试试:

    pgrep -u username
    

    如果您需要杀死这些选定的PIDs,则无需针对结果运行kill。您只需使用pkill 而不是pgrep

    pkill -u username pattern
    

    如果出于任何原因您确实仅限于使用pskillps 允许格式化输出。这样您就可以grep 获取模式,而不会无意中得到grep 本身的PID

    kill -9 $(ps -u username -opid=.comm= | grep pattern | awk '{print $1}')
    

    使用kill $() 的唯一缺点是$() 可能返回空并且您会收到错误消息。解决方法是将错误信息扔给/dev/nullpkill即使没有什么可杀的也不会抱怨。

    最后,如果您需要匹配命令参数而不是命令本身,请使用-opid=,args= 输出参数而不是输出命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-30
      • 2019-02-04
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多