最近一直在苦思这个问题,该怎么做。
我有个开源项目
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
wisdom 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 的话单独写一套代码。另外估计也有现成的第三方库可用。
|