我有一个用 Perl 编写的在 Ubuntu 上运行的守护进程,它现在是单线程的。当它启动时,它会执行通常的 Proc::Daemon 操作,然后进入一个由 bool 值界定的 while 循环。守护进程通过“服务守护进程启动”正常启动。但是当我想用“服务守护程序停止”杀死它时,它不会停止。
应该通过使用信号处理程序翻转 bool 值来停止:
$SIG{INT} = $SIG{TERM} = $SIG{HUP} = \&signalHandler;
sub signalHandler {
$continue = 0;
}
不幸的是,主循环中也有一个 sleep 。所以守护进程直到 sleep 结束才结束。我希望守护进程立即结束。但我不想设置很短的 sleep 时间。事实上,如果它确定应该这样做,我希望能够设置几个小时的 sleep 时间。
执行此操作的最佳方法是什么?
我正在考虑在主循环中调用某种阻塞函数而不是 sleep 。这个阻塞函数在某个线程死掉之前不会返回。然后在信号处理程序中我会简单地杀死那个休眠线程。这是一个好方法吗?我该怎么做,我以前从未在 Perl 中做过多线程。
谢谢你的帮助
最佳答案
这是针对这种情况的解决方法:
1.
当您的软件开始运行时创建命名管道,例如mkfifo
2.
用 select
替换 sleep
调用系统调用(作为替代方案,您可以使用 perl 包 IO::Select
而不是 select 系统调用)。
设置选择以监视管道何时准备好输入。
select
允许指定超时,就像 sleep 一样。
select
调用在超时结束或满足文件条件时返回。
3.
如果发生超时,则运行循环的主体代码。如果数据出现在管道上,则终止。
4.
要终止,请将数据发送到命名管道。
关于linux - 立即停止 perl 守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23127646/