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

怎么检测一个进程是否还正常?

  •  
  •   haython · 2015-01-04 21:14:10 +08:00 · 3953 次点击
    这是一个创建于 3630 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个命令行下运行的php脚本,或者python脚本,或者其它什么脚本吧,是常驻的,怎么能检测这个脚本是否还正常运行?碰到好几次脚本的进程还在,但是已经卡死在那里了
    16 条回复    2015-01-06 09:12:00 +08:00
    horsley
        1
    horsley  
       2015-01-04 22:22:09 +08:00   ❤️ 1
    你常驻的脚本必然是一个无限循环,你可以在每次循环结束的时候更新一个变量,存放更新时候的时间,再想办法造一个借口把这个变量信息暴露到外面去(或者写出到一个磁盘文件),那么当你读到这个暴露的信息,发现这个时间距离现在已经超过很多次循环应该用掉的时间,例如循环是一分钟一次的任务,但是上一次写入时间已经是5分钟前,认为脚本已经卡死需要重新启动
    datou552211
        2
    datou552211  
       2015-01-04 23:18:02 +08:00   ❤️ 1
    我一般加一个HTTP服务,访问一下,返回简单的信息。tcp也行
    NewYear
        3
    NewYear  
       2015-01-04 23:18:50 +08:00   ❤️ 1
    是windows还是非windows

    windows有系统api可以查询窗口是不是没有响应状态
    user32.dll里的IsHungAppWindow(句柄)[返回0,窗口正常,返回1,窗口没有响应]
    standin000
        4
    standin000  
       2015-01-04 23:19:48 +08:00   ❤️ 1
    linux 下进程有个zombie状态,处于这个状态基本是卡死了。
    lululau
        5
    lululau  
       2015-01-04 23:21:43 +08:00   ❤️ 1
    写日志
    haython
        6
    haython  
    OP
       2015-01-04 23:24:39 +08:00
    @horsley 感觉不是特别的“优雅”
    haython
        7
    haython  
    OP
       2015-01-04 23:25:19 +08:00
    @datou552211 还得维护http服务
    haython
        8
    haython  
    OP
       2015-01-04 23:26:11 +08:00
    @NewYear 我用的是linux,不过感觉windows这个挺不错的
    hahastudio
        9
    hahastudio  
       2015-01-04 23:40:17 +08:00 via Android   ❤️ 1
    观测一个 while True 的程序,无非就是:
    1. 让它自己报告状态,那么日志的方式是最常用的,因为你可以自定义汇报等级,信息细度
    2. 你自己问它的状态,那么你就需要额外一个服务提供询问的操作,这个服务必须简单,简单到不会出错,不然你看不到结果,不知道是业务部分挂了,还是询问部分挂了

    我个人推荐日志
    bombless
        10
    bombless  
       2015-01-04 23:46:49 +08:00 via iPhone   ❤️ 1
    看io吧,卡死的程序经常就没有io了。
    一部分程序跑进一个死循环或者开始了一个很长的计算结果占满了一个核经常也是不良情况的兆头。
    9hills
        11
    9hills  
       2015-01-05 00:01:43 +08:00 via iPad   ❤️ 1
    你的脚本不打日志么?
    RemRain
        12
    RemRain  
       2015-01-05 00:12:00 +08:00   ❤️ 1
    @horsley 的方案最靠谱,隔一段时间输出点东西,或者往外写点东西,证明自己还活着。类似 linux 下的看门狗,如果一段时间不喂狗,系统自动重启。

    @standin000 zombie 不叫卡死,zombie 是进程已经结束了,但父进程还没给他收尸。
    GhostFlying
        13
    GhostFlying  
       2015-01-05 00:20:33 +08:00   ❤️ 1
    第一反应就是 watchdog,写文件或者什么都可以
    haython
        14
    haython  
    OP
       2015-01-05 00:22:38 +08:00
    @9hills 只有屏幕输出和错误的日志存储到Mongo
    9hills
        15
    9hills  
       2015-01-05 09:55:20 +08:00 via iPhone   ❤️ 1
    @haython 这个设计不好,本地日志也是要打的,另外周期性的日志也是要的。不是不优雅,这是最简单的办法
    standin000
        16
    standin000  
       2015-01-06 09:12:00 +08:00   ❤️ 1
    @RemRain 我的经验是父进程很少收尸,只得靠自己。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1242 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:33 · PVG 01:33 · LAX 09:33 · JFK 12:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.