2013-11-25 77 views
4

我正在开发一个与多个进程通信的守护进程。守护进程无法始终监视进程,但它必须能够正确识别进程是否死亡,释放它为之保留的恐慌资源。如何识别长时间运行的进程是否死亡?

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

最简单的形式是使用他们的PID。但是最终另一个进程可以被分配相同的PID,而不需要我的工具注意。

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

,这似乎符合POSIX标准的一个更复杂的想法是:

  • 每个进程创建一个临时文件。
  • 将其锁定使用flock
  • 告诉我的守护进程“我的身份与此文件相关联”。
  • 任何时候守护进程都可以检查临时文件。如果它被锁定,那么这个过程仍然存在。如果不是,那么这个过程就是死的。

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

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

编辑:守护进程必须能够在重新启动后恢复,因此无法为每个进程保留持久连接。

回答

1

但我找不到方法如何让进程启动时间在POSIX的方式。

尝试standard "etime" format specifierLC_ALL=C ps -eo etime= $PIDS

凭心而论,我可能会建立自己的直播过程中的表,而这依赖于进程表和运行时间。这基本上是你的文件锁定方法,尽管我可能将所有的锁文件聚集在一个已知的地方,并通过PID命名,例如/var/run/my-app/8819.lock。事实上,这甚至可以改装到长时间运行的进程上,因为文件描述符上的文件锁可以在exec()之间继承。 (当然,如果我关心的长期流程有一个共同的家长,那么我宁愿查询共同的家长,谁可以成为一个可靠的权威机构,在哪个流程正在运行,哪些没有。)

1

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

1

除文件外,还有其他方法存在并且有各种优点/折衷 - 大多数“标准”IPC机制也适用于此 - 套接字,管道,消息队列,共享内存......基本上选择一种机制,允许你的应用程序向守护进程宣告它已经开始(也许它正在退出,以便有序关闭)。在它之间,它可以定期发送“我还在这里”的消息,守护进程可以注意到它何时没有得到,或者守护进程可以定期轮询或执行什么......有很多方法可以完成你想要的,但不知道更多关于你想要实现的确切架构,很难指出“最好的方式”...

+0

问题是守护程序必须能够在重新启动后恢复。这意味着它不能通过丢失套接字连接或类似的东西来检测进程死亡。要求进程定期更新它们与守护进程的连接可能会起作用,尽管这会使进程更复杂。我正在寻找内核为我管理的东西,而守护进程只是检查它(如过程开始时间)。 –

+0

@PetrPudlák是的,好吧,每一项额外的要求都可能使解决方案变得更加复杂......这是非常正常的事情。 – twalberg