V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
tianshiyeben
V2EX  ›  程序员

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

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

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

    我有个开源项目

    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
    这个去群里让群主想办法,群里也挺多人在讨论这个问题。看群里有没有好办法能够解决
    wisdom
        12
    wisdom  
       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   ·   实用小工具   ·   1295 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 17:22 · PVG 01:22 · LAX 09:22 · JFK 12:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.