可以使用kill(SIGKILL,$$)杀死正在睡眠的Perl程序吗?

时间:2011-09-14 09:38:08

标签: perl process kill

我正在运行一个Perl程序,程序中有一个模块,由外部进程触发,以终止所有子进程并终止其执行。 这很好。

但是,当某个函数说xyz()正在执行时,条件上会有一个sleep(60)语句。

现在,该函数在等待某个值时重复执行。

当我触发上述杀戮过程时,过程不会发生。

有没有人知道为什么会这样?

1 个答案:

答案 0 :(得分:0)

我不明白你是怎么在它睡觉的时候试图从你自己内部(你的问题主题$$)中杀死一个进程。

如果你是从一个不同的进程中杀死,那么它将拥有自己的$$。你需要首先找出原始进程的PID(通过拖钓进程列表或以某种方式从原始进程传递它)。

杀死睡眠过程非常有效

$ ( date ; perl5.8 -e 'sleep(100);' ; date ) &

   Wed Sep 14 09:48:29 EDT 2011

$ kill -KILL 8897

   Wed Sep 14 09:48:54 EDT 2011

这也适用于其他“杀戮”信号('INT','ABRT','退出','TERM')


更新:重新阅读时,您可能认为的问题是“由外部流程触发”部分不会发生。如果是这种情况,您需要:

  • 在进入睡眠状态之前在进程中设置CATCHABLE信号处理程序($SIG{'INT'}) - 处理程序无法捕获SIGKILL。

  • 从所述“外部流程”发送SIGINT

  • 一旦sleep()被来自SIGINT处理程序的SIGINT中断,请执行所有必需的清理。