可以通过子进程向父进程发送 SIGTERM 信号量来终结父进程么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
yangyaofei
V2EX    程序员

可以通过子进程向父进程发送 SIGTERM 信号量来终结父进程么?

  •  
  •   yangyaofei
    yangyaofei 2016-05-01 21:14:13 +08:00 5643 次点击
    这是一个创建于 3449 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,我的父进程只负责进程管理,是否跑完数据的逻辑在子进程………

    今天晚上刚刚部署在服务器,一千多万条的数据,光想数据完整和效率了,都从家里出来了才想起来没写终止………还有一个小时就跑完了

    第 1 条附言    2016-05-02 02:56:36 +08:00

    ##已经测试成功!!!

    首先

    如果仅仅是fork的进程没有做任何处理的话,不管你用什么方法发送kill SIGTERM都是会导致子进程被init收养吧....

    然后

    我也测试了(顺便测试了脚本别的地方,发现了一个bug,然后改到现在,呵呵呵呵呵,妈蛋),fork之后子进程kill父进程,但是我前面有说我会在父进程处理信号量,所以我很成功的kill掉了整个进程树

    结论

    如果父进程定义了处理SIGTERM信号量的函数,而这个处理函数能够很好的kill掉子进程,并在子进程都已经确实被kill之后在自我了断.那么用子进程发送给父进程SIGTERM信号量的方法就是可行的

    还有....

    有人说,貌似我的问题可以用返回值搞定 0.0 是哈 但是我最终还是用了我上述的方法,毕竟正好测试嘛....

    17 条回复    2016-05-02 20:19:22 +08:00
    Jaylee
        1
    Jaylee  
       2016-05-01 21:30:58 +08:00   1
    这不成了孤儿进程了?
    EPr2hh6LADQWqRVH
        2
    EPr2hh6LADQWqRVH  
       2016-05-01 21:38:48 +08:00   5
    你个逆子
    louirobert
        3
    louirobert  
       2016-05-01 21:39:12 +08:00   1
    听上去很奇怪啊:你让 parent 等 child 结束后自己结束不就行了?
    hrong
        4
    hrong  
       2016-05-01 22:14:31 +08:00   1
    楼主自己都已经说了,父进程只负责进程管理,子进程跑逻辑。。。
    如果可以杀了老子的话,结果应该父进程被杀,子进程会被 0 号(还是 1 号?)进程接管,变成俗称的僵尸进程。但是子进程的内容应该还是在跑的,直到其运行结束。
    yangyaofei
        5
    yangyaofei  
    OP
       2016-05-01 22:43:20 +08:00 via Android
    @Jaylee 但是主进程有捕捉 SIGTERM 信号,它会终结所有子进程之后自我了断,不存在僵尸啊,僵尸的可能是 9 信号吧………
    @avastms ………………
    @hong 同上………再说只是发送信号,和普通的 kill 命令一样吧……正在回家的路上………回去 test
    yangyaofei
        6
    yangyaofei  
    OP
       2016-05-01 22:44:51 +08:00 via Android
    @louirobert parent 负责监视所有子进程,有坏掉停止的就会被重启,如果是你说的那样,就会无限重启了,因为父进程不知道子进程已经跑完任务了………
    just4test
        7
    just4test  
       2016-05-01 23:02:55 +08:00   1
    @yangyaofei 正常退出和崩掉有区别的吧。
    检查返回值就行了。
    yangyaofei
        8
    yangyaofei  
    OP
       2016-05-01 23:07:17 +08:00 via Android
    @just4test 哦,对哈,谢谢谢谢
    littlewing
        9
    littlewing  
       2016-05-02 00:20:06 +08:00   1
    刚写了个测试程序, fork 之后父进程 sleep ,子进程发送 SIGTERM ,父进程就会被杀掉
    而且子进程的 parent pid 变成了 1
    littlewing
        10
    littlewing  
       2016-05-02 00:21:24 +08:00
    @yangyaofei 人家一楼明明说的是孤儿进程
    @avastms 。。。。。。。。。。。
    yangyaofei
        11
    yangyaofei  
    OP
       2016-05-02 02:56:54 +08:00
    @littlewing 啊~僵尸和孤儿差不多了.如果仅仅是 fork 的进程没有做任何处理的话,不管你用什么方法发送 kill SIGTERM 都是会导致子进程被 init 收养吧....
    我也测试了(顺便测试了脚本别的地方,发现了一个 bug,然后改到现在,呵呵呵呵呵,妈蛋),fork 之后子进程 kill 父进程,但是我前面有说我会在父进程处理信号量,所以我很成功的 kill 掉了整个进程树

    也就是说,对于父进程(本来就是为了子进程管理来写的)定义了处理 SIGTERM 信号量的函数,说白了就是会在 kill 他的时候他会先 kill 掉所有子进程,并在子进程都已经确实被 kill 之后在自我了断.当然我的子进程也会捕捉信号量好保存处理的进度.这样就基本没问题了.我问问题的原因是我不知道子进程发送给父进程信号量有没有这个权限,发现可以就肯定可以了的说.

    吐槽一句多进程,那乱序真难捕捉.....在自己电脑上测试没问题(3 处理进程),到了服务器上(7 处理进程)瞬间真的乱了....
    msg7086
        12
    msg7086  
       2016-05-02 03:32:43 +08:00
    僵尸怎么会和孤儿差不多?
    孤儿院 -> 僵尸院(?
    dndx
        13
    dndx  
       2016-05-02 03:47:08 +08:00
    @Jaylee Zombie processes should not be confused with orphan processes: an orphan process is a process that is still executing, but whose parent has died. These do not remain as zombie processes; instead, (like all orphaned processes) they are adopted by init (process ID 1), which waits on its children. The result is that a process that is both a zombie and an orphan will be reaped automatically.

    Source: https://en.wikipedia.org/wiki/Zombie_process
    ryd994
        14
    ryd994  
       2016-05-02 05:02:00 +08:00
    讲真……这个还是 ipc (比如 pipe )一下比较好吧……
    yangyaofei
        15
    yangyaofei  
    OP
       2016-05-02 10:08:02 +08:00 via Android
    @msg7086 差不多的意思是这样都导致我的程序出错,所以差不多………
    @dndx
    @ryd994 我用的 python 的 queue ,但是我我不想做双向的,因为我的程序是三层的,而判断是否完成在第三层且只能在第三层,所以我才用这个方法的,结果上看效果不错。
    xuboying
        16
    xuboying  
       2016-05-02 11:18:21 +08:00 via Android
    @yangyaofei kill 爹地之后自己退出就行了,干嘛要自己处理信号?因为你还想 kill 兄弟?
    yangyaofei
        17
    yangyaofei  
    OP
       2016-05-02 20:19:22 +08:00 via Android
    @xuboying 对啊,不仅如此,我的父进程会监视所有子进程,有关闭的就开启,直接自己关闭会出问题
    关于     帮助文档     自助推广系统     博客     API     FAQ &nbp;   Solana     3554 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 04:34 PVG 12:34 LAX 21:34 JFK 00:34
    Do have faith in what you're doing.
    ubao 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