我正在使用proc :: queue来管理一堆子进程,我将它们像这样解雇:
if(Proc::Queue::running_now() < $kids)
{
logger("Starting another server process...");
my $newprocessid = Proc::Queue::run_back(\&serverprocess);
logger("New child process id: $newprocessid");
$childprocessids{$newprocessid} = 1;
}
所以现在我有一个子进程ID的哈希,我可以在父进程发送一个kill SIGTERM时杀死它 .
但是,如果子进程被外部杀死怎么办?父进程知道启动另一个子进程以弥补丢失的进程,并且新的子进程最终以我的哈希值结束,但父进程如何找出死亡的子进程的PID以将其从哈希中删除所以我以后不要试图杀死它?
我可以设置 $SIG{CHLD}
但是我没有看到如何让子PID从哈希中删除它 .
2 回答
您可以将父项及其子项放在自己的进程组中,并通过向父项发送信号来终止整个系列 .
根据您的问题的性质,您可能愿意离开(麦克马纳斯先生!),并且因为每次尝试
kill
对已经死亡的子进程感到失败 .如果父进程除了跟踪孩子之外什么都不做,那么您只需要一个简单的循环 .
如果在父进程中有其他处理,则将第二个参数中的
WNOHANG
位设置为waitpid
会告诉系统调用不要阻塞 . 这允许您定期收获僵尸儿童,然后返回其他处理 .出于演示目的,假设我们开始了一群困倦的孩子 .
然后为了模拟来自外部的杀戮,我们分叉另一个孩子随机挑选其余的兄弟姐妹 .
现在,上面的循环读取了ob告 .
仔细检查没有人活着 .
输出:
如果唯一的问题是"remove it from the hash so I don't try and kill it later",您可以尝试以下方法: