• 请不要在回答技术问题时复制粘贴 AI 生成的内容
tianshiyeben
V2EX  ›  程序员

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

  •  
  •   tianshiyeben ·
    tianshiyeben · Jan 19, 2020 · 6133 views
    This topic created in 2485 days ago, the information mentioned may be changed or developed.

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

    我有个开源项目

    https://github.com/tianshiyeben/wgcloud

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

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

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

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

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

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

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

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

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

    接口可以通过 http 接口,也可以是其他形式( tcp,udp )
    存储可以是数据库也可以是缓存。
    tianshiyeben
    tianshiyeben
    OP
    Jan 19, 2020
    19
    @privil 汗,我这是做的开源产品,想做成一个比较简单工具。不是针对某一个运维同学
    tianshiyeben
    tianshiyeben
    OP
    Jan 19, 2020
    20
    @xiaochun41 我还是不能侵入应用,不能让他们自动上报。只能在外围想想办法,比如 pid 文件
    msg7086
    msg7086
    Jan 19, 2020
    21
    pid 是古典的方式,cgroup 是现代的方式。
    scarletass
    scarletass
    Jan 19, 2020
    22
    进程 id 可以动态获取为什么写到文件去?
    qyvlik
    qyvlik
    Jan 19, 2020
    23
    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
    houzhimeng
    Jan 19, 2020
    24
    shell :变量名获取 $pid,然后监控....
    tianshiyeben
    tianshiyeben
    OP
    Jan 19, 2020
    25
    @qyvlik 谢谢,你写的比较全面
    @houzhimeng 谢谢
    chibupang
    chibupang
    Jan 19, 2020 via iPhone
    26
    find +xargs+awk 查找进程的 ID,然后写入 xml 文件
    back0893
    back0893
    Jan 19, 2020
    27
    程序上线自动发送 pid
    tianshiyeben
    tianshiyeben
    OP
    Jan 19, 2020 via Android
    28
    还是用 pid 文件,这样简单点。其他的建议也很好,就是使用起来用户体验不好。
    @back0893
    @chibupang
    ysc3839
    ysc3839
    Jan 20, 2020 via Android
    29
    不能通过进程名获取吗?
    tianshiyeben
    tianshiyeben
    OP
    Jan 20, 2020
    30
    @ysc3839 进程名称可以获取到,但是要解析才能拿到进程 id,而且很难做到跨系统。
    lqxzzz
    lqxzzz
    Jan 20, 2020
    31
    myprocess & echo $! > /tmp/myprocess.pid
    ysc3839
    ysc3839
    Jan 20, 2020 via Android
    32
    @tianshiyeben 我个人感觉不难吧?类 Unix 系统应该都有 /proc,Windows 的话单独写一套代码。另外估计也有现成的第三方库可用。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1520 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 07:03 · PVG 15:03 · LAX 23:03 · JFK 02:03
    ♥ Do have faith in what you're doing.