V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
jingcheng407
V2EX  ›  Linux

Linux 下,检测程序挂掉并自动重启的正确姿势是什么

  •  1
     
  •   jingcheng407 · 2020-08-07 15:05:34 +08:00 · 4619 次点击
    这是一个创建于 1604 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前是写一个额外的脚本去监控这个进程,没了就重启,体验一般.

    请问有没有系统级的方案,或者现成业界主流方案,请大大们赐教

    28 条回复    2020-08-08 22:52:14 +08:00
    Juicpt
        1
    Juicpt  
       2020-08-07 15:09:13 +08:00
    linux 也有类似 windows 服务吧,可以直接拉起来自己
    wlsnx
        2
    wlsnx  
       2020-08-07 15:11:02 +08:00
    systemd
    luolw1998
        3
    luolw1998  
       2020-08-07 15:11:24 +08:00
    Jirajine
        4
    Jirajine  
       2020-08-07 15:13:34 +08:00 via Android
    docker 自带的--restart 参数
    zliea
        5
    zliea  
       2020-08-07 15:14:06 +08:00
    如果可以热备,像数据库主从切换,应该都是定时执行一个 sql(show status),然后进行切换的。
    zliea
        6
    zliea  
       2020-08-07 15:14:36 +08:00
    关键词 keepalived
    whenov
        7
    whenov  
       2020-08-07 15:14:50 +08:00
    写个 systemd service,添加:
    Restart=on-failure
    jasonyang9
        8
    jasonyang9  
       2020-08-07 15:18:40 +08:00 via Android
    systemd 大法
    cgyimustc
        9
    cgyimustc  
       2020-08-07 15:19:31 +08:00
    如果是用定时探测的思路,方法很多,比如 crontab ; 如果是需要快速并且实时,需要使用父子进程通信的信号,如果子进程异常退出,会给父进程发 signal, 具体可以参考各种 daemon(supervisor/systemd), 或者使用.pid 文件,如 nginx
    lusi1990
        10
    lusi1990  
       2020-08-07 15:53:18 +08:00
    我都用过的:

    systemd ( Restart=on-failure )
    supervisor ()
    docker (--restart )

    推荐 systemd, 如果服务器重启,docker 或者 supervisor 不是开机启动,程序就不会启动。supervisor 我记得有 web 页面监控
    saytesnake
        11
    saytesnake  
       2020-08-07 15:56:37 +08:00
    systemd 最佳。
    nightwitch
        12
    nightwitch  
       2020-08-07 15:59:10 +08:00
    systemd,supervisor,pm2,docker...太多了
    都是很成熟的方案了。
    如果你不是远古时代的 Linux 那就用 systemd 吧,绝大多数发行版的基础设施,不用额外安装
    JJstyle
        13
    JJstyle  
       2020-08-07 16:03:42 +08:00
    😄,systemd vs *nix 哲学 ,systemd 赢了
    Oceanhime
        15
    Oceanhime  
       2020-08-07 16:15:06 +08:00 via iPad
    系统级的用 systemd 写个 service 就行,方便好用。
    现成的方案可以用 supervisor,有 python/go 两个版本,个人一直在用的方案,简单强大。
    或者可以试试 docker —restart,但是毕竟需要额外启动一个 daemon,可能需要占用一点额外资源。
    如果是第三方,记得先设置自启动
    Chenamy2017
        16
    Chenamy2017  
       2020-08-07 16:40:43 +08:00
    自写一个服务,检测程序是不是存在,不存在就拉起来。
    julyclyde
        17
    julyclyde  
       2020-08-07 17:54:12 +08:00
    唯一可靠的就是 SIGCHLD
    即 init respawn 或者 systemd service 方案
    pursuer
        18
    pursuer  
       2020-08-07 19:16:29 +08:00
    最正确的姿势当然是不要让程序挂掉
    misaka19000
        19
    misaka19000  
       2020-08-07 19:30:17 +08:00
    不用那么麻烦,我告诉楼主一个关键词楼主去搜就行了

    Supervisor
    CallMeReznov
        20
    CallMeReznov  
       2020-08-07 19:46:55 +08:00
    这个不是 supervisor 干的吗?
    或者 pm2?
    autoxbc
        21
    autoxbc  
       2020-08-07 20:18:09 +08:00   ❤️ 1
    这是用 Deno 实现的保活,前端看着肯定亲切

    (async function callee(){
       await Deno.run( {
         cwd:'./',
         cmd:[
          'deno',
          'run',
          '--allow-net',
          '--allow-read',
          'file_server.ts',
        ],
      } ).status();
      
       setTimeout( callee , 3000 );
    } )();

    出错后隔 3 秒重启,防止一执行就出错的话,错误信息疯狂滚屏
    linvaux
        22
    linvaux  
       2020-08-07 21:48:40 +08:00
    supervisor
    nuk
        23
    nuk  
       2020-08-07 22:00:50 +08:00
    while true; do xxx; sleep 1; done
    hanguofu
        24
    hanguofu  
       2020-08-07 22:13:45 +08:00
    systemd service 添加
    Restart=on-failure
    就一定可以了吗 ? 如果是的话,求个完整的 systemd service 范例 ,谢谢!
    EminemW
        25
    EminemW  
       2020-08-07 22:36:39 +08:00
    守护进程
    GGGG430
        26
    GGGG430  
       2020-08-07 22:38:01 +08:00
    @nuk +1
    Cbdy
        27
    Cbdy  
       2020-08-07 22:47:22 +08:00 via Android
    system
    docker
    pm2
    还可以写个 crontab 自己监控一下

    方法很多
    hijoker
        28
    hijoker  
       2020-08-08 22:52:14 +08:00
    @Oceanhime 这个还有 golang 版本的啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2839 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:16 · PVG 16:16 · LAX 00:16 · JFK 03:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.