怎样监测一个程序是否正在运行

2019-03-04 09:55:16 +08:00
 mathzhaoliang

如题,我现在要写一个监测程序,目的是判断系统中某个特殊的程序 /进程是否正在运行。我所知道的是用 pgrep 命令查看某个程序名的所有进程名字,但是这样是否太笨了?而且无法判断哪个是主进程。请问有什么好的方法没有?

PS: 系统可以理解为 linux。

2302 次点击
所在节点    问与答
11 条回复
ic2y
2019-03-04 10:02:34 +08:00
强制要求所有的程序内嵌 http 服务,进行 状态检测和 负载信息收集。
mathzhaoliang
2019-03-04 10:23:05 +08:00
@ic2y 做不到。比如我要监测的是某个硬件传感器是否启动了呢?
aibangjuxin
2019-03-04 10:35:01 +08:00
/usr/bin/pgrep -o <process_name>
where '-o' is the oldest (least recently started) of the matching processes
JamesR
2019-03-04 10:36:19 +08:00
“某个特殊的程序”是你自己的程序吗?让它连接你的数据库,定时新增记录即可。
或者用现成的进程监视工具,网上一搜有。
mathzhaoliang
2019-03-04 10:49:54 +08:00
@JamesR 比如说我写一个车辆自动驾驶的系统,我要在系统启动时检测车载摄像头是否开始工作了,然后再去读取数据。
kernel
2019-03-04 10:58:36 +08:00
写个.service 文件,systemctl status
tt67wq
2019-03-04 11:01:14 +08:00
watchdog 监控日志可否?
Lax
2019-03-04 11:05:23 +08:00
去掉“比如”,把真正的需要说清楚吧,大家这么猜需求也不是办法。场景一变,方案就不适用了,你说是车载系统估计 1 楼也不会推荐内嵌 http。有子进程的时候可以 setprocname,参考 nginx。另外可以通过 ppid 来查看是否有父进程来判断
fxxkgw
2019-03-04 11:38:29 +08:00
kill -0
JamesR
2019-03-04 11:40:58 +08:00
@mathzhaoliang #5 这种一般只能是自己写脚本了吧,简陋点没关系,先能工作用起来。
xomix
2019-03-04 14:06:12 +08:00
这种需求常见两种解决方案:

1、心跳方案:
定时将心跳信息保存到指定位置(单独服务端 /数据库 /文件等,这里只是方便查询程序可以快速定位心跳信息,位置你自己按照需求定),查询方查询心跳信息发现无心跳信息即视为离线。

2、被动回复方案:
开启指定的查询返回方法( web/pipe/socket 等,这里的查询返回方法你自己和查询方确认即可。),查询方主动发起查询请求,返回结果,超时未返回视为离线。

也有很多这两种方案结合的方案等,具体你需要根据自己的需求和实际资源去做。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/540711

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX