我正在开发一个与多个进程通信的守护进程。守护进程无法始终监视进程,但它必须能够正确识别进程是否死亡,释放它为之保留的恐慌资源。如何识别长时间运行的进程是否死亡?
进程可以与守护进程通信,在开始时给它一些信息,但反之亦然。所以守护进程不能仅仅询问一个进程的身份。
最简单的形式是使用他们的PID。但是最终另一个进程可以被分配相同的PID,而不需要我的工具注意。
更好的方法是使用PID加上过程开始的时间。具有相同PID的新流程将具有明显的启动时间。但我找不到如何以POSIX的方式获得流程启动时间的方法。使用ps
或查看/proc/<pid>/stat
似乎不够便携。
,这似乎符合POSIX标准的一个更复杂的想法是:
- 每个进程创建一个临时文件。
- 将其锁定使用
flock
- 告诉我的守护进程“我的身份与此文件相关联”。
- 任何时候守护进程都可以检查临时文件。如果它被锁定,那么这个过程仍然存在。如果不是,那么这个过程就是死的。
但是,这似乎不必要的复杂。
有没有更好的或标准的方法?
编辑:守护进程必须能够在重新启动后恢复,因此无法为每个进程保留持久连接。
问题是守护程序必须能够在重新启动后恢复。这意味着它不能通过丢失套接字连接或类似的东西来检测进程死亡。要求进程定期更新它们与守护进程的连接可能会起作用,尽管这会使进程更复杂。我正在寻找内核为我管理的东西,而守护进程只是检查它(如过程开始时间)。 –
@PetrPudlák是的,好吧,每一项额外的要求都可能使解决方案变得更加复杂......这是非常正常的事情。 – twalberg