【问题标题】:bash: counter inside a while loop (kill and kill -9)bash:在一个while循环内计数器(杀死并杀死-9)
【发布时间】:2013-02-10 14:41:16
【问题描述】:

所以我最近了解到kill is not a synchronous 命令,所以我在 bash 中使用了这个 while 循环,太棒了:

while kill PID_OF_THE_PROCESS 2>/dev/null; do sleep 1; done

但是,在某些情况下(非常罕见,但仍然会发生),进程会卡住,并且不会对终止信号起作用。在这些情况下,杀死应用程序的唯一方法是使用“kill -9”。

所以我想知道,如何在 bash 中修改上面的 while 循环,仅当循环已达到第 10 次迭代时才使用 -9 参数?

【问题讨论】:

  • 你有什么问题?你想知道如何数数吗?
  • 我想知道如何在 bash 的 while 循环中使用计数器,我不懂 bash
  • 如果您想知道如何在 bash 中创建计数器,请不要提出关于 kill -9 的问题。这将严重混淆水域,因为kill -9 通常是一个坏主意,并且绝对在脚本中这样做是一个坏主意。
  • 我认真考虑过这样做,但是暴露一个更通用的问题(没有“kill”命令)会更难理解......所以只包括我想使用的命令示例,很有意义恕我直言
  • 广义的,killall 问题和这个问题解决了同样的问题。如果这不是一个骗局,那么这是一个过于狭隘的问题,对未来的读者没有多大用处,应该基于这些理由关闭。

标签: bash scripting while-loop kill kill-process


【解决方案1】:

当然,使用计数器,但这有点笨拙。

您可能真正想要做的是使用0 作为您的信号,这对进程没有任何作用,但让您检查进程是否仍然存在。 (如果进程不存在,kill -0 $pid 将返回非零退出状态。)然后,你知道,不要只是 kill -9 它。进程不会无缘无故卡住,它们卡住是因为他们无法释放资源,例如发生网络或文件系统阻塞时。解决块,然后进程可以自行清理。

【讨论】:

  • 抱歉,您能详细说明一下 0 信号吗?我仍然不明白 kill 和 kill -0 之间的区别
  • @knocte kill -0 如果找到一个,则不会对进程执行任何操作。它只是让你知道它就在那里。可以把它想象成 ping 进程以查看它是否还活着。
  • 但是普通的 kill(不带 -0)如果不存在也会返回非零状态,所以这并没有真正改善任何事情
  • @knocte 在这种情况下并不是那么有用,但脚本本身背后的前提是冒险,这就是为什么这个答案是关于如何完全避免使用kill -9
  • @knocte 最后要考虑的一点:如果您的 SIGTERM 在第一次迭代中成功终止进程,但另一个您不想终止的不相关进程使用相同的 pid 生成,该怎么办?跨度>
【解决方案2】:

发送一次信号就够了。

kill $PID 2>/dev/null
sleep 10;
if kill -0 $PID 2>/dev/null
  kill -9 $PID
fi

针对您的反问:

c=0
while true; do
    echo $c;
    c=$((c+1));
    if [ $c -eq 10 ]; then break; fi;
done

【讨论】:

  • 我说的是第 10 次迭代,而不是 10 秒
  • 好吧,如果你将两个代码块合二为一,我会投赞成票:)
【解决方案3】:

正如其他用户所说....在使用这种残酷的方法之前,您必须解决阻塞的原因...无论如何...试试这个

#!/bin/bash

i=0

PID_OF_THE_PROCESS="your pid you can set as you like"

# send it just once
kill $PID_OF_THE_PROCESS 2>/dev/null;

while [ $i -lt 10 ];
do
    # still alive?
    [ -d /proc/$PID_OF_THE_PROCESS ] || exit;
    sleep 1;
    i=$((i+1))
done

# 10 iteration loop and still alive? be brutal
kill -9 $PID_OF_THE_PROCESS

【讨论】:

  • PID_OF_THE_PROCESS 应该是一个变量吗?
  • 这几乎就是我想要实现的!它只是在第 10 次之前的迭代中缺少对“kill”的调用
  • @knocte 如果您发送一次 SIGTERM,它将在可以终止的情况下终止。再发送 9 次是没有意义的。
  • 这可能毫无意义,但我想确定......(它可能毫无意义,但它不会造成任何伤害,对吧?)
  • 如果你知道那是多余的,但你还是想要它......只需将 kill 移到循环内
【解决方案4】:

有几种方法可以实现这一点,但您确实要求修改现有循环,所以:

count=0
while kill PID_OF_THE_PROCESS 2>/dev/null
do 
    sleep 1; 
    (( count++ ))
    if (( count > 9 ))
    then
        kill -9 PID_OF_THE_PROCESS 2>/dev/null
     fi
done

【讨论】:

  • 如果count
猜你喜欢
  • 1970-01-01
  • 2012-10-22
  • 2018-04-04
  • 2011-03-30
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多