Python杀死父进程但子进程离开

我的光

当我尝试杀死python进程时,通过子进程启动的子进程os.system不会同时终止。

当父进程在python中崩溃时杀死子进程,Python进程不会调用atexit(atexit似乎无法与信号配合使用)

这是否意味着我需要自己处理这种情况?如果是这样,这样做的首选方式是什么?

> python main.py
> ps
4792 ttys002    0:00.03 python run.py
4793 ttys002    0:00.03 python loop.py 
> kill -15 4792
> ps 
4793 ttys002    0:00.03 python loop.py

样例代码:

main.py

import os
os.system('python loop.py')

loop.py

import time

while True:
    time.sleep(1000)

更新1

我做了一些实验,找到了可行的版本,但仍然对逻辑感到困惑。

import os
import sys
import signal
import subprocess


def sigterm_handler(_signo, _stack_frame):
    # it raises SystemExit(0):
    print 'go die'
    sys.exit(0)


signal.signal(signal.SIGTERM, sigterm_handler)

try:
    # os.system('python loop.py') 
    # use os.system won't work, it will even ignore the SIGTERM entirely for some reason 
    subprocess.call(['python', 'loop.py'])
except:
    os.killpg(0, signal.SIGKILL)
f

kill -15 4792在您的示例中发送SIGTERMrun.py-它不发送任何内容到loop.py(或它的父外壳)。SIGTERM默认情况下不会传播到进程树中的其他进程。

os.system('python loop.py')启动至少两个进程的shell和python进程。您不需要它;使用subprocess.check_call(),在没有隐式外壳的情况下运行单个子进程。顺便说一句,如果您的子进程是Python脚本;考虑导入它并运行相应的功能

os.killpg(0, SIGKILL)发送SIGKILL信号到当前的进程组。 Shell为每个管道创建一个新的进程组(作业),因此 os.killpg() 父级中in对子级没有影响 (请参阅更新)。请参阅如何终止由shell = True启动的python子进程

#!/usr/bin/env python
import subprocess
import sys

try:
    p = subprocess.Popen([executable, 'loop'])
except EnvironmentError as e: # 
    sys.exit('failed to start %r, reason: %s' % (executable, e))
else:
    try: # wait for the child process to finish
        p.wait()
    except KeyboardInterrupt: # on Ctrl+C (SIGINT)
        #NOTE: the shell sends SIGINT (on CtrL+C) to the executable itself if
        #  the child process is in the same foreground process group as its parent 
        sys.exit("interrupted")

更新

似乎os.system(cmd)没有为创建新的进程组cmd

>>> import os
>>> os.getpgrp()
16180
>>> import sys
>>> cmd = sys.executable + ' -c "import os; print(os.getpgrp())"'
>>> os.system(cmd) #!!! same process group
16180
0
>>> import subprocess
>>> import shlex
>>> subprocess.check_call(shlex.split(cmd))
16180
0
>>> subprocess.check_call(cmd, shell=True)
16180
0
>>> subprocess.check_call(cmd, shell=True, preexec_fn=os.setpgrp) #!!! new
18644
0

因此,os.system(cmd)在您的示例中,该os.killpg()呼叫应将其杀死

虽然如果我用bash运行它;它确实为每个管道创建了一个新的流程组:

$ python -c "import os; print(os.getpgrp())"
25225
$ python -c "import os; print(os.getpgrp())"
25248

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果父项在Python中被杀死,则杀死子进程

来自分类Dev

杀死子管道进程的父进程

来自分类Dev

我如何杀死所有其他正在运行的python进程而不杀死父进程

来自分类Dev

杀死父进程不会杀死孩子

来自分类Dev

僵尸进程(杀死子进程和父进程)

来自分类Dev

如何杀死所有子进程而不杀死父进程

来自分类Dev

当父级在python中退出时,如何杀死子进程?

来自分类Dev

仅杀死父进程,不杀死bash中的子进程和父进程

来自分类Dev

Python多处理:如果父进程被杀死,子进程会挂起吗?

来自分类Dev

当父进程等待子进程终止时,子进程如何杀死父进程?

来自分类Dev

在不离开孤儿的情况下从python / bash杀死一个子子进程

来自分类Dev

C,Fork后无法杀死父进程

来自分类Dev

孩子可以被非父进程杀死吗?

来自分类Dev

pkill无法杀死父进程ID为1的进程

来自分类Dev

Bash子进程在执行eval exec时会杀死父进程

来自分类Dev

父进程终止后如何杀死所有子进程?

来自分类Dev

杀死python执行的后台进程

来自分类Dev

启动进程并从Ruby on Rails应用程序中杀死它,而无需离开僵尸进程

来自分类Dev

如何在不杀死子进程的情况下杀死父shell脚本进程?

来自分类Dev

用pkill python杀死python进程

来自分类Dev

Python子进程通信杀死了我的进程

来自分类Dev

Linux中的Python:使用Shell杀死进程和子进程

来自分类Dev

当进程被杀死时,python守护进程线程正在退出

来自分类Dev

Python多处理:优雅地杀死进程

来自分类Dev

知道在Linux上杀死哪个python进程?

来自分类Dev

如何杀死后台python进程?

来自分类Dev

如何杀死使用 Timer() 的 python 进程?

来自分类Dev

使用 Python /F 标志杀死进程

来自分类Dev

如果exec.Start()创建的进程的父进程被SIGINT杀死,为什么会退出呢?

Related 相关文章

  1. 1

    如果父项在Python中被杀死,则杀死子进程

  2. 2

    杀死子管道进程的父进程

  3. 3

    我如何杀死所有其他正在运行的python进程而不杀死父进程

  4. 4

    杀死父进程不会杀死孩子

  5. 5

    僵尸进程(杀死子进程和父进程)

  6. 6

    如何杀死所有子进程而不杀死父进程

  7. 7

    当父级在python中退出时,如何杀死子进程?

  8. 8

    仅杀死父进程,不杀死bash中的子进程和父进程

  9. 9

    Python多处理:如果父进程被杀死,子进程会挂起吗?

  10. 10

    当父进程等待子进程终止时,子进程如何杀死父进程?

  11. 11

    在不离开孤儿的情况下从python / bash杀死一个子子进程

  12. 12

    C,Fork后无法杀死父进程

  13. 13

    孩子可以被非父进程杀死吗?

  14. 14

    pkill无法杀死父进程ID为1的进程

  15. 15

    Bash子进程在执行eval exec时会杀死父进程

  16. 16

    父进程终止后如何杀死所有子进程?

  17. 17

    杀死python执行的后台进程

  18. 18

    启动进程并从Ruby on Rails应用程序中杀死它,而无需离开僵尸进程

  19. 19

    如何在不杀死子进程的情况下杀死父shell脚本进程?

  20. 20

    用pkill python杀死python进程

  21. 21

    Python子进程通信杀死了我的进程

  22. 22

    Linux中的Python:使用Shell杀死进程和子进程

  23. 23

    当进程被杀死时,python守护进程线程正在退出

  24. 24

    Python多处理:优雅地杀死进程

  25. 25

    知道在Linux上杀死哪个python进程?

  26. 26

    如何杀死后台python进程?

  27. 27

    如何杀死使用 Timer() 的 python 进程?

  28. 28

    使用 Python /F 标志杀死进程

  29. 29

    如果exec.Start()创建的进程的父进程被SIGINT杀死,为什么会退出呢?

热门标签

归档