如何确定一个长期运行的过程是否死亡?

我正在开发一个与多个进程进行通信的守护进程。 守护进程无法始终监视进程,但它必须能够正确识别进程是否死亡,释放它所持有的恐慌资源。

进程可以与守护进程进行通信,在开始时给它一些信息,但反之亦然。 所以守护进程不能仅仅询问一个进程的身份。

最简单的forms是使用他们的PID。 但最终另一个过程可以分配相同的PID没有我的工具不知不觉中。

更好的方法是使用PID加上进程开始的时间。 具有相同PID的新过程将具有不同的开始时间。 但是我找不到如何以POSIX方式获得进程启动时间的方法。 使用ps或看/proc/<pid>/stat似乎不够便携。

符合POSIX标准的更复杂的想法是:

  • 每个进程创build一个临时文件。
  • flock锁住它
  • 告诉我的守护进程“我的身份与这个文件相关”。
  • 任何时候守护进程都可以检查临时文件。 如果它被locking,这个过程是活着的。 如果不是,那么这个过程就是死的。

但是这似乎不必要的复杂。

有没有更好的或标准的方法?

编辑:守护进程必须能够重新启动后恢复,所以不可能保持每个进程的持久连接。

    但是我找不到如何以POSIX方式获得进程启动时间的方法。

    试试标准的“etime”格式说明符 : LC_ALL=C ps -eo etime= $PIDS

    公平地说,我可能会构建我自己的现场流程表,而不是依靠流程表和时间流逝。 这基本上是你的文件锁定的方法,尽管我可能将所有的锁文件聚集在一个已知的地方,并通过PID命名,例如/var/run/my-app/8819.lock 。 事实上,甚至可以对长时间运行的流程进行改进,因为文件描述符上的文件锁定可以通过exec()继承。

    (当然,如果我关心的长期流程有一个共同的家长,那么我宁愿查询共同的家长,谁可以成为一个可靠的权威,哪个流程正在运行,哪个不是。)

    标准的方式是不必要的复杂的。 这就是POSIX兼容环境中的生活…

    除文件以外的其他方法存在,并有各种好处/权衡 – 大多数“标准”IPC机制也将工作 – 套接字,管道,消息队列,共享内存…基本上选择一种机制,允许您的应用程序向守护进程宣告它已经开始(也许它正在退出,以便有序关闭)。 在这之间,它可以定期发送“我还在这里”的消息,守护进程可以注意到它什么时候没有得到,或者守护进程可以定期轮询或者什么…有很多方法可以完成你想要的,但是如果不了解更多关于您要实现的确切架构的信息,就很难指出“最好的方法”。