一台服务器上的程序 1 启动了多个子程序(脚本启动,固定),这个时候程序 1 突然挂了,那么这些子程序还在跑着,这种场景有什么好的处理方式吗?最好是程序 1 突然挂了的时候能带走它启动的所有子程序? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gzk329
V2EX    Java

一台服务器上的程序 1 启动了多个子程序(脚本启动,固定),这个时候程序 1 突然挂了,那么这些子程序还在跑着,这种场景有什么好的处理方式吗?最好是程序 1 突然挂了的时候能带走它启动的所有子程序?

  •  
  •   gzk329 2023 年 2 月 3 日 3409 次点击
    这是一个创建于 1176 天前的主题,其中的信息可能已经有所发展或是发生改变。
    20 条回复    2023-02-03 21:27:59 +08:00
    gzk329
        1
    gzk329  
    OP
       2023 年 2 月 3 日
    我记得是 Java Process 启动子进程,会随着主进程挂掉而一起挂掉,但是这个子进程的实际 processId 好像和获取的 processId 不一致,加了 1 ,所有选择的脚本启动,能解决这个问题,但是主程序挂了的话,子进程会失去控制
    cheng6563
        2
    cheng6563  
       2023 年 2 月 3 日   3
    丢容器,程序 1 以 pid 1 启动,这样他挂了就整个容器都挂了。
    Mohanson
        3
    Mohanson  
       2023 年 2 月 3 日
    Linux 进程组

    https://man7.org/linux/man-pages/man2/setpgid.2.html
    https://man7.org/linux/man-pages/man2/prctl.2.html PR_SET_PDEATHSIG 小章节

    至于 Java 要用什么 API 调用这个不了解
    killva4624
        4
    killva4624  
       2023 年 2 月 3 日
    Systemd 或者容器
    ruanimal
        5
    ruanimal  
       2023 年 2 月 3 日
    daemon
    eibici
        6
    eibici  
       2023 年 2 月 3 日
    加例检吧?
    julyclyde
        7
    julyclyde  
       2023 年 2 月 3 日
    你是腾讯 TEG 的吧?最好弃用那俩垃圾框架

    启动脚本开头设置个 trap ,收到 SIGCHLD 的话就 kill 掉 %1 %2 %3 等等子进程
    启动脚本里多个进程都&启动,转入后台,变成%1 %2 %3
    然后脚本末尾 wait
    gzk329
        8
    gzk329  
    OP
       2023 年 2 月 3 日
    @cheng6563 容器这个功能我们也是有的,但是把普通的和 docker 的分成两类了,现在得解决普通的异常场景...
    opengps
        9
    opengps  
       2023 年 2 月 3 日
    需要反向思维(因为是子进程而不是子线程)
    子程序单独加个线程去检测是否存在主进程,主进程不再则自己的进程退出
    8355
        10
    8355  
       2023 年 2 月 3 日
    优雅停机?
    kaiki
        11
    kaiki  
       2023 年 2 月 3 日 via iPhone
    @opengps 这样检测岂不是得用定时器这些重复判断的方法来额外占用资源?感觉有点不理想。
    opengps
        12
    opengps  
       2023 年 2 月 3 日
    @kaiki #11 其实是个通信的心跳用法,这个做法在高可用等场景并不少见,实际通信包很小,占用不了太多资源
    julyclyde
        13
    julyclyde  
       2023 年 2 月 3 日
    “固定”这个就限制了:不会有什么好的方案

    你必须得改
    aw2350
        14
    aw2350  
       2023 年 2 月 3 日
    context 上下文。或者每个子服务 启动后都有一个异步独立线程去监听主服务的状态。
    如果用 go 做,这是很简单的事情
    litguy
        15
    litguy  
       2023 年 2 月 3 日
    我们是 SIGABORT 自杀,自己捕获这个触发系统 PANIC
    jorneyr
        16
    jorneyr  
       2023 年 2 月 3 日
    这 2 天用 go 启动进程:
    - 使用 os.StartProcess 启动的多个后台进程,go 进程挂了的话所有它启动的进程都会被杀掉 (满足楼主的需求)
    - 适用 exec.Command 执行 nohup x > 2>&1 & 启动的后台进程,go 进程挂了的话它启动的进程不会被杀掉,因为这些进程的 PPID 是 1
    liuyongwang
        17
    liuyongwang  
       2023 年 2 月 3 日
    守护线程 daemon
    tool2d
        18
    tool2d  
       2023 年 2 月 3 日
    用 linux 管道把两个程序连接起来,如果管道挂了,那么两个程序都自动退出。
    pkking
        19
    pkking  
       2023 年 2 月 3 日
    PID 1 的进程不是会负责回收孤儿进程吗(如果这个进程结束了且没有人 wait ),在容器里有 tiini/dumb-init ,非容器的 systemd 都会做的吧
    kaneg
        20
    kaneg  
       2023 年 2 月 3 日
    可以看下 systemd 。systemd 的功能强大到让一些 Linux 大牛吐槽它管的太多了,想必你的这个需求应该已经在它的考虑范围了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2831 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 84ms UTC 11:27 PVG 19:27 LAX 04:27 JFK 07:27
    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