我正在运行一个Perl程序,程序中有一个模块,由外部进程触发,以终止所有子进程并终止其执行。 这很好。
但是,当某个函数说xyz()
正在执行时,条件上会有一个sleep(60)
语句。
现在,该函数在等待某个值时重复执行。
当我触发上述杀戮过程时,过程不会发生。
有没有人知道为什么会这样?
答案 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中断,请执行所有必需的清理。