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

2016-05-01 21:14:13 +08:00
 yangyaofei

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

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

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

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

吐槽一句多进程,那乱序真难捕捉.....在自己电脑上测试没问题(3 处理进程),到了服务器上(7 处理进程)瞬间真的乱了....
msg7086
2016-05-02 03:32:43 +08:00
僵尸怎么会和孤儿差不多?
孤儿院 -> 僵尸院(?
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
2016-05-02 05:02:00 +08:00
讲真……这个还是 ipc (比如 pipe )一下比较好吧……
yangyaofei
2016-05-02 10:08:02 +08:00
@msg7086 差不多的意思是这样都导致我的程序出错,所以差不多………
@dndx
@ryd994 我用的 python 的 queue ,但是我我不想做双向的,因为我的程序是三层的,而判断是否完成在第三层且只能在第三层,所以我才用这个方法的,结果上看效果不错。
xuboying
2016-05-02 11:18:21 +08:00
@yangyaofei kill 爹地之后自己退出就行了,干嘛要自己处理信号?因为你还想 kill 兄弟?
yangyaofei
2016-05-02 20:19:22 +08:00
@xuboying 对啊,不仅如此,我的父进程会监视所有子进程,有关闭的就开启,直接自己关闭会出问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/275700

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX