我正在开发一个与多个进程通信的守护进程。守护程序无法一直监视进程,但它必须能够正确识别进程是否死亡以释放它为其保留的恐慌资源。
进程可以与守护进程通信,在开始时为其提供一些信息,但反之亦然。所以守护进程不能只是向进程询问它的身份。
最简单的形式是仅使用它们的PID。但最终可以在没有我的工具注意的情况下为另一个进程分配相同的PID。
更好的方法是使用PID加上过程开始的时间。具有相同PID的新进程将具有不同的开始时间。但我找不到如何以POSIX方式获取进程开始时间的方法。使用ps
或查看/proc/<pid>/stat
似乎不够便宜。
更符合POSIX标准的更复杂的想法是:
flock
但这似乎不必要地复杂化了。
有更好的标准方式吗?
编辑:守护程序必须能够在重新启动后恢复,因此无法为每个进程保持持久连接。
答案 0 :(得分:1)
标准方式是不必要的复杂方法。那'符合POSIX标准的环境......
答案 1 :(得分:1)
存在除文件之外的其他方法并且具有各种好处/权衡 - 大多数“标准”IPC机制也适用于此 - 套接字,管道,消息队列,共享内存......基本上选择一种允许的机制你的应用程序向守护进程宣布它已经启动(也许它正在退出,有序关闭)。在它们之间,它可以定期发送“我还在这里”的消息,并且守护进程可以注意到它没有得到它,或者守护进程可以定期轮询或者其他东西......有很多方法可以实现你想要的,但是如果不了解你想要实现的确切架构,就很难指出“最好的方式”......
答案 2 :(得分:1)
但我找不到如何以POSIX方式获取流程开始时间的方法。
试试standard "etime" format specifier:LC_ALL=C ps -eo etime= $PIDS
公平地说,我可能会构建自己的实时进程表,而不是依赖于进程表和已用时间。这基本上是你的文件锁定方法,虽然我可能会将所有锁定文件聚合在一个已知的位置并通过PID命名它们,例如/var/run/my-app/8819.lock
。实际上,甚至可以对长时间运行的进程进行改进,因为文件描述符上的文件锁可以在exec()
之间继承。
(当然,如果我关心的长时间运行的流程有一个共同的父级,那么我宁愿查询共同的父级,他们可以是运行哪些进程的可靠权限,哪些不是。)