最近一直在苦思这个问题,该怎么做。
我有个开源项目
https://github.com/tianshiyeben/wgcloud
是做服务器分布式监控的软件,其中包括监控进程,但是进程 id 要配置到 xml。
这样有个弊端,就是每次应用重启后,进程 id 就变了,要重新配置 xml 里的进程 id,还要重启 agent。这样比较麻烦。
有的同学建议,从 pid 文件里读取,但是这样对应用启动要求比较高,很多运维同学不知道怎么生成 pid 文件,说实话我也没做过。
我自己想的办法是准备从 sever 端页面配置进程信息,这样至少不用每次修改配置文件了。但是这样没有从根本解决我的疑惑。
1 202 2020-01-19 12:28:06 +08:00 via Android 监控运行路径,再找 pid |
![]() | 2 asilin 2020-01-19 12:28:29 +08:00 这个时候,就是 cgroups 大显身手的时候了,用 systemd-run 来运行程序,指定 slice 和 sevice 名称,即使进程重启,依然是在在对应的 cgroups 里。 |
![]() | 3 cominghome 2020-01-19 12:36:36 +08:00 有的同学建议,从 pid 文件里读取,但是这样对应用启动要求比较高,很多运维同学不知道怎么生成 pid 文件,说实话我也没做过。 建议换个运维。百度一下五分钟解决的事情。 |
![]() | 4 tianshiyeben OP @asilin 这个估计不行啊,我还要支持在 win 下跑呢。 |
![]() | 5 tianshiyeben OP @202 @cominghome tks 因为我还要支持在 win 下运行,所以不能只考虑在 linux 下可用。 我还是同时支持读进程 id 文件和进程 id 配置,这样就可以了。 现在貌似没有更好办法了。 我刚忘了说了,这个监控要支持 win |
![]() | 6 swulling 2020-01-19 12:48:36 +08:00 配置进程的文件路径,然后从路径反差 PID 即可,windows 和 linux 都能轻松做到这一点 |
![]() | 7 tianshiyeben OP @swulling 谢谢,我找下资料。 |
![]() | 8 STRRL 2020-01-19 12:53:35 +08:00 via Android 曾经我们也有这个问题 我们的应用是 spring based 然后引入了 actuator 通过一个约定好的 /actuator/info 做发现 然后就解决了 如果后续上了 spring cloud 有了 discovery 会更方便 |
![]() | 9 wangyzj 2020-01-19 13:27:44 +08:00 有端口吗? 从端口找回来行吗? |
![]() | 10 tianshiyeben OP |
![]() | 11 zanelee 2020-01-19 13:37:21 +08:00 这个去群里让群主想办法,群里也挺多人在讨论这个问题。看群里有没有好办法能够解决 |
![]() | 12 gpg 2020-01-19 13:37:59 +08:00 bash 反查 pid |
![]() | 13 lovedebug 2020-01-19 13:39:30 +08:00 1. pid 文件最简单 2. 程序可以暴露一个接口有监控器查 pid 号 3. 程序启动时自动上报 pid 4. win 上应用注册为 service 也可以查到 pid |
![]() | 14 STRRL 2020-01-19 13:40:59 +08:00 @tianshiyeben 如果还是 java based 的话, 可以考虑用 Java Attach API + MBeans 的方式, 反正你也有一个 agent 在机器上跑了. 我们也会用这种方式发现非 web 的 java 应用. |
15 hankai17 2020-01-19 13:49:45 +08:00 根据进程名查 pid 把 pid 记录到 /tmp 路径下的一个文件里 每次查的时候 再读这个文件对比 |
![]() | 16 privil 2020-01-19 14:10:10 +08:00 @cominghome #3 运维不知道怎么生存 pid 文件的,建议可以开除。 |
![]() | 17 tianshiyeben OP @zanelee 什么群啊 |
18 xiaochun41 2020-01-19 14:21:42 +08:00 重启时程序自动上报进程 id 到一个地方即可(比如通过接口上报的某个服务,这个服务在将进程 id 落地到存储),要用时候,只从存储读取即可 接口可以通过 http 接口,也可以是其他形式( tcp,udp ) 存储可以是数据库也可以是缓存。 |
![]() | 19 tianshiyeben OP @privil 汗,我这是做的开源产品,想做成一个比较简单工具。不是针对某一个运维同学 |
![]() | 20 tianshiyeben OP @xiaochun41 我还是不能侵入应用,不能让他们自动上报。只能在外围想想办法,比如 pid 文件 |
![]() | 21 msg7086 2020-01-19 14:37:05 +08:00 pid 是古典的方式,cgroup 是现代的方式。 |
![]() | 22 scarletass 2020-01-19 14:37:33 +08:00 进程 id 可以动态获取为什么写到文件去? |
23 qyvlik 2020-01-19 14:56:16 +08:00 1. 修改程序上报 pid 给你的 agent 2. 用 脚本通过特征,例如端口,运行路径等等找出 pid 3. 类似于 window 那种注册 service,通过 service 找 pid 4. 或者 linux 下用 supervisor,直接一键生成 pid 文件: http://liyangliang.me/posts/2015/06/using-supervisor/ 5. v 友补充好多其他方案了 |
![]() | 24 houzhimeng 2020-01-19 15:16:45 +08:00 shell :变量名获取 $pid,然后监控.... |
![]() | 25 tianshiyeben OP |
![]() | 26 chibupang 2020-01-19 21:23:31 +08:00 via iPhone find +xargs+awk 查找进程的 ID,然后写入 xml 文件 |
27 back0893 2020-01-19 21:46:27 +08:00 程序上线自动发送 pid |
![]() | 28 tianshiyeben OP |
![]() | 29 ysc3839 2020-01-20 02:04:09 +08:00 via Android 不能通过进程名获取吗? |
![]() | 30 tianshiyeben OP @ysc3839 进程名称可以获取到,但是要解析才能拿到进程 id,而且很难做到跨系统。 |
31 lqxzzz 2020-01-20 10:13:59 +08:00 myprocess & echo $! > /tmp/myprocess.pid |
![]() | 32 ysc3839 2020-01-20 13:14:14 +08:00 via Android @tianshiyeben 我个人感觉不难吧?类 Unix 系统应该都有 /proc,Windows 的话单独写一套代码。另外估计也有现成的第三方库可用。 |