微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

主板ID – WMI C ++ – 可靠吗?

从类Unix系统获取唯一的ID

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

每个进程创build一个临时文件

用flock锁住它

告诉我的守护进程“我的身份与这个文件相关”。

任何时候守护进程都可以检查临时文件。 如果它被locking,这个过程是活着的。 如果不是,那么这个过程就是死的。

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

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

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

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

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐