linux – 如何识别长时间运行的进程是否已经死亡?

linux – 如何识别长时间运行的进程是否已经死亡?,第1张

概述我正在研究一个与多个进程通信的守护进程.守护程序无法一直监视进程,但它必须能够正确识别进程是否死亡以释放它为其保留的恐慌资源. 进程可以与守护进程通信,在开始时为其提供一些信息,但反之亦然.所以守护进程不能只是向进程询问它的身份. 最简单的形式是仅使用它们的PID.但最终可以在没有我的工具注意的情况下为另一个进程分配相同的PID. 更好的方法是使用PID加上过程开始的时间.具有相同PID的新进程将 我正在研究一个与多个进程通信的守护进程.守护程序无法一直监视进程,但它必须能够正确识别进程是否死亡以释放它为其保留的恐慌资源.

进程可以与守护进程通信,在开始时为其提供一些信息,但反之亦然.所以守护进程不能只是向进程询问它的身份.

最简单的形式是仅使用它们的PID.但最终可以在没有我的工具注意的情况下为另一个进程分配相同的PID.

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

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

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

但这似乎不必要地复杂化.

有更好的标准方式吗?

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

解决方法

But I Couldn’t find a way how to get the process start time in a POSIX way.

尝试standard “etime” format specifier:LC_ALL = C ps -eo etime = $PIDS

公平地说,我可能会构建自己的实时进程表,而不是依赖于进程表和已用时间.这基本上是你的文件锁定方法,虽然我可能会将所有锁定文件聚合在一个已知位置并通过PID命名它们,例如/var/run/my-app/8819.lock.实际上,甚至可以对长时间运行的进程进行改进,因为文件描述符上的文件锁可以跨exec()继承.

(当然,如果我关心的长时间运行的进程有一个共同的父进程,那么我宁愿查询共同的父进程,它可以是运行哪些进程的可靠权限,哪些不是.)

总结

以上是内存溢出为你收集整理的linux – 如何识别长时间运行的进程是否已经死亡?全部内容,希望文章能够帮你解决linux – 如何识别长时间运行的进程是否已经死亡?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1017918.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存