监控进程 id,每次重启 id 都变化,有什么好的办法监控吗

2020-01-19 11:37:59 +08:00
 tianshiyeben

最近一直在苦思这个问题,该怎么做。

我有个开源项目

https://github.com/tianshiyeben/wgcloud

是做服务器分布式监控的软件,其中包括监控进程,但是进程 id 要配置到 xml。

这样有个弊端,就是每次应用重启后,进程 id 就变了,要重新配置 xml 里的进程 id,还要重启 agent。这样比较麻烦。

有的同学建议,从 pid 文件里读取,但是这样对应用启动要求比较高,很多运维同学不知道怎么生成 pid 文件,说实话我也没做过。

我自己想的办法是准备从 sever 端页面配置进程信息,这样至少不用每次修改配置文件了。但是这样没有从根本解决我的疑惑。

4517 次点击
所在节点    程序员
32 条回复
202
2020-01-19 12:28:06 +08:00
监控运行路径,再找 pid
asilin
2020-01-19 12:28:29 +08:00
这个时候,就是 cgroups 大显身手的时候了,用 systemd-run 来运行程序,指定 slice 和 sevice 名称,即使进程重启,依然是在在对应的 cgroups 里。
cominghome
2020-01-19 12:36:36 +08:00
有的同学建议,从 pid 文件里读取,但是这样对应用启动要求比较高,很多运维同学不知道怎么生成 pid 文件,说实话我也没做过。

建议换个运维。百度一下五分钟解决的事情。
tianshiyeben
2020-01-19 12:44:58 +08:00
@asilin 这个估计不行啊,我还要支持在 win 下跑呢。
tianshiyeben
2020-01-19 12:46:49 +08:00
@202
@cominghome
tks
因为我还要支持在 win 下运行,所以不能只考虑在 linux 下可用。
我还是同时支持读进程 id 文件和进程 id 配置,这样就可以了。
现在貌似没有更好办法了。

我刚忘了说了,这个监控要支持 win
swulling
2020-01-19 12:48:36 +08:00
配置进程的文件路径,然后从路径反差 PID 即可,windows 和 linux 都能轻松做到这一点
tianshiyeben
2020-01-19 12:50:34 +08:00
@swulling 谢谢,我找下资料。
STRRL
2020-01-19 12:53:35 +08:00
曾经我们也有这个问题 我们的应用是 spring based

然后引入了 actuator 通过一个约定好的 /actuator/info 做发现 然后就解决了

如果后续上了 spring cloud 有了 discovery 会更方便
wangyzj
2020-01-19 13:27:44 +08:00
有端口吗?
从端口找回来行吗?
tianshiyeben
2020-01-19 13:36:29 +08:00
@wangyzj
@STRRL
这个监控进程是,是想监控所有的应用,可能没有端口。
也有的不是 spring 进程。
反正是各种各样的
zanelee
2020-01-19 13:37:21 +08:00
这个去群里让群主想办法,群里也挺多人在讨论这个问题。看群里有没有好办法能够解决
wisdom
2020-01-19 13:37:59 +08:00
bash 反查 pid
lovedebug
2020-01-19 13:39:30 +08:00
1. pid 文件最简单
2. 程序可以暴露一个接口有监控器查 pid 号
3. 程序启动时自动上报 pid
4. win 上应用注册为 service 也可以查到 pid
STRRL
2020-01-19 13:40:59 +08:00
@tianshiyeben 如果还是 java based 的话, 可以考虑用 Java Attach API + MBeans 的方式, 反正你也有一个 agent 在机器上跑了. 我们也会用这种方式发现非 web 的 java 应用.
hankai17
2020-01-19 13:49:45 +08:00
根据进程名查 pid
把 pid 记录到 /tmp 路径下的一个文件里
每次查的时候 再读这个文件对比
privil
2020-01-19 14:10:10 +08:00
@cominghome #3 运维不知道怎么生存 pid 文件的,建议可以开除。
tianshiyeben
2020-01-19 14:21:30 +08:00
@zanelee 什么群啊
xiaochun41
2020-01-19 14:21:42 +08:00
重启时程序自动上报进程 id 到一个地方即可(比如通过接口上报的某个服务,这个服务在将进程 id 落地到存储),要用时候,只从存储读取即可

接口可以通过 http 接口,也可以是其他形式( tcp,udp )
存储可以是数据库也可以是缓存。
tianshiyeben
2020-01-19 14:22:44 +08:00
@privil 汗,我这是做的开源产品,想做成一个比较简单工具。不是针对某一个运维同学
tianshiyeben
2020-01-19 14:35:23 +08:00
@xiaochun41 我还是不能侵入应用,不能让他们自动上报。只能在外围想想办法,比如 pid 文件

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

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

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

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

© 2021 V2EX