linux - 立即停止 perl 守护进程

标签 linux multithreading perl daemon

我有一个用 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/

相关文章:

linux - 通过 Bash 脚本检索进程网络使用情况(自重启以来,如果需要)

linux - 是否有任何过程可以将文件从 Windows 主机复制到虚拟机,反之亦然?

java - Android 处理程序和线程在启动时未运行?

创建 3 个线程并使用 WSAWaitForMultipleEvents() 和 WSAEnumNetworkEvents() 时 CPU 使用率 100%

perl - 如何在 Perl 中查看文件的下一行

string - 当 $STRING 以 "\t\t"结尾时,如何让 split(/\t/, $STRING) 检测空值?

linux - 如果没有安装 postgres,我该如何安装 DBD::Pg?

linux - 无法编译 .c,因为找不到 .h 文件

linux - 具有不同目录中的源文件的 Makefile

java - 制作一个简单的计时器