监控进程 id,每次重启 id 都变化,有什么好的办法监控吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
tianshiyeben
V2EX    程序员

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

  •  
  •   tianshiyeben
    tianshiyeben 2020-01-19 11:37:59 +08:00 5206 次点击
    这是一个创建于 2099 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    我有个开源项目

    https://github.com/tianshiyeben/wgcloud

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

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

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

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

    第 1 条附言    2020-01-19 14:25:07 +08:00
    谢谢大家,我就先用 pid 文件,另外兼容进程 id 方式。
    这样比较直接和通用,兼用性强。
    最后放一张效果图,其他的同学发给我的。
    ![1](< >)
    32 条回复    2020-01-20 13:14:14 +08:00
    202
        1
    202  
       2020-01-19 12:28:06 +08:00 via Android
    监控运行路径,再找 pid
    asilin
        2
    asilin  
       2020-01-19 12:28:29 +08:00
    这个时候,就是 cgroups 大显身手的时候了,用 systemd-run 来运行程序,指定 slice 和 sevice 名称,即使进程重启,依然是在在对应的 cgroups 里。
    cominghome
        3
    cominghome  
       2020-01-19 12:36:36 +08:00
    有的同学建议,从 pid 文件里读取,但是这样对应用启动要求比较高,很多运维同学不知道怎么生成 pid 文件,说实话我也没做过。

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

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

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

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

    接口可以通过 http 接口,也可以是其他形式( tcp,udp )
    存储可以是数据库也可以是缓存。
    tianshiyeben
        19
    tianshiyeben  
    OP
       2020-01-19 14:22:44 +08:00
    @privil 汗,我这是做的开源产品,想做成一个比较简单工具。不是针对某一个运维同学
    tianshiyeben
        20
    tianshiyeben  
    OP
       2020-01-19 14:35:23 +08:00
    @xiaochun41 我还是不能侵入应用,不能让他们自动上报。只能在外围想想办法,比如 pid 文件
    msg7086
        21
    msg7086  
       2020-01-19 14:37:05 +08:00
    pid 是古典的方式,cgroup 是现代的方式。
    scarletass
        22
    scarletass  
       2020-01-19 14:37:33 +08:00
    进程 id 可以动态获取为什么写到文件去?
    qyvlik
        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 友补充好多其他方案了
    houzhimeng
        24
    houzhimeng  
       2020-01-19 15:16:45 +08:00
    shell :变量名获取 $pid,然后监控....
    tianshiyeben
        25
    tianshiyeben  
    OP
       2020-01-19 16:04:46 +08:00
    @qyvlik 谢谢,你写的比较全面
    @houzhimeng 谢谢
    chibupang
        26
    chibupang  
       2020-01-19 21:23:31 +08:00 via iPhone
    find +xargs+awk 查找进程的 ID,然后写入 xml 文件
    back0893
        27
    back0893  
       2020-01-19 21:46:27 +08:00
    程序上线自动发送 pid
    tianshiyeben
        28
    tianshiyeben  
    OP
       2020-01-19 22:39:51 +08:00 via Android
    还是用 pid 文件,这样简单点。其他的建议也很好,就是使用起来用户体验不好。
    @back0893
    @chibupang
    ysc3839
        29
    ysc3839  
       2020-01-20 02:04:09 +08:00 via Android
    不能通过进程名获取吗?
    tianshiyeben
        30
    tianshiyeben  
    OP
       2020-01-20 09:04:55 +08:00
    @ysc3839 进程名称可以获取到,但是要解析才能拿到进程 id,而且很难做到跨系统。
    lqxzzz
        31
    lqxzzz  
       2020-01-20 10:13:59 +08:00
    myprocess & echo $! > /tmp/myprocess.pid
    ysc3839
        32
    ysc3839  
       2020-01-20 13:14:14 +08:00 via Android
    @tianshiyeben 我个人感觉不难吧?类 Unix 系统应该都有 /proc,Windows 的话单独写一套代码。另外估计也有现成的第三方库可用。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1292 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 210ms UTC 17:20 PVG 01:20 LAX 10:20 JFK 13:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86