V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yangyaofei
V2EX  ›  程序员

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

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

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

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

    第 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 ………………
    @hrong 同上………再说只是发送信号,和普通的 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   ·   实用小工具   ·   2600 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:50 · PVG 18:50 · LAX 02:50 · JFK 05:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.