Bash代码段用于杀死一个进程,直到它死了?


8

我试图编写一个健壮的bash脚本,并在其中创建一个后台进程。在脚本末尾,我想杀死它。我有它的PID。

我在想这样的事

while [[ ps ef $PID ]] ; do
  kill $PID
  sleep 0.5
done

有什么更好的建议吗?这种方法可能存在问题吗?


不是ps -ef
user1686

1
grawity:多数民众赞成在BSD风格与UNIX选项,但ef确实更适合UNIX选项。我自己会选择“ ps ao pid”
凯尔·布​​兰特

while [[ ps ef $PID ]]是语法错误。我想你是故意的while ps ef $PID
丹尼斯,

Answers:


10

反复杀死一个进程的问题是,在创建新进程时出现了竞争状况。不太可能,但是您可能会在退出睡眠状态时退出该进程,并使用相同的PID启动新进程。

您为什么要反复取消该过程?如果是因为该过程将退出,但是在收到信号后可能需要一些时间才能退出,则可以使用wait

 kill $PID
 wait $PID

在理想的系统中,您无需重复a kill或issue kill -9 $PID。如果必须这样做,则可能要考虑修复正在运行的内容,因此不必这样做。同时,您可能不会遇到竞争状况,并且可以通过(例如)在终止进程之前检查/ proc / $ PID /的时间戳来防止出现竞争状况。但是,那是很糟糕的技巧。


1
如果PID不属于子进程,则此方法不起作用,即该脚本试图控制源自其他地方的进程的执行。我bash: wait: pid 32137 is not a child of this shell尝试的时候知道了。:(
贾斯汀力

9

对于每个建议从此kill $PID开始的人kill -9 $PID,我都必须提醒您使用kill -9没用

不不不。不要使用kill -9。

它并没有给过程一个干净的机会:

  1. 关闭插座连接

  2. 清理临时文件

  3. 通知其孩子它要消失了

  4. 重置其终端特性

等等,依此类推。

通常,发送15,然后等待一两秒钟,如果不起作用,则发送2,如果不起作用,则发送1。如果不起作用,请删除二进制文件,因为程序的行为不当!

不要使用kill -9。不要带出联合收割机只是为了整理花盆。

现在,我不同意“删除二进制文件的一部分”,但是该进展似乎不仅仅只是一个kill -9

我也同意在此处提到的具有相同PID的新进程的创建中关注竞争条件。


0

首先执行正常的杀死操作,“睡眠” x秒数,然后如果仍然存在,则杀死-9。另外,这似乎是您遇到的奇怪情况,可能想向我们解释更大的问题。


同意 如果它在一个SIGTERM(默认情况下由kill发送的信号)后没有响应并关闭,则可能不会响应第2、3、4,...。因此,您的下一个操作步骤应该是SIGKILL(kill- 9)。当然,您应该确保“睡眠X秒”中的X足够长,以使该进程即使在系统负载很重的情况下也可以执行正常的“清理桌面并离开”操作-这可能需要花费一小部分时间通常在系统震荡的情况下持续一秒钟,但要花费数十秒。
David Spillett

0

通常,您想先尝试一下kill $PID

然后让它睡一会儿,看看它是否会正常退出。

如果不是,则执行kill -9 $PID以强制摆脱它。


-1

为什么不只是

kill -9 $PID


2
因为您想给进程一个很好的清理和消亡的机会,这就是TERM信号(默认信号)的作用。KILL信号(“ -9”)不会给进程带来机会。
ktower

很好,但是原始海报确实说他只是想杀死它。
克里斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.