Linux下杀死父进程后如何继续执行Python子进程逻辑?
问题原因
当你杀死父进程后,当前Python进程大概率会收到SIGHUP信号(若父进程是终端会话进程),导致进程直接终止,后续的touch命令根本没机会执行。
解决方案
要让子进程在父进程退出后持续运行,核心是让进程脱离原会话与父进程的控制,以下是两种可行方案:
方案一:用os.fork()创建独立子进程
通过fork创建的子进程,在父进程退出后会被init/systemd收养,完全独立执行后续逻辑:
import os import psutil from time import sleep from subprocess import run from shlex import split pid = os.fork() if pid == 0: # 子进程:杀死原父进程,执行后续操作 psutil.Process(os.getppid()).kill() sleep(3) run(split('touch /home/tobias/foo')) else: # 父进程直接退出,让子进程独立运行 os._exit(0)
方案二:忽略SIGHUP信号并脱离终端
在杀死父进程前,先忽略SIGHUP信号,同时让进程脱离终端控制,避免被终端发送的信号终止:
import signal import psutil from time import sleep from subprocess import run from shlex import split import os # 忽略SIGHUP信号 signal.signal(signal.SIGHUP, signal.SIG_IGN) # 创建新会话,脱离原终端控制 os.setsid() # 杀死父进程 psutil.Process().parent().kill() sleep(3) run(split('touch /home/tobias/foo'))
补充说明
os.fork()是Linux/Unix系统专属方法,创建的子进程与父进程完全解耦,父进程退出不影响子进程执行。os.setsid()会生成新的会话组,彻底切断进程与原终端的关联,从根源避免终端发送的SIGHUP信号。
内容的提问来源于stack exchange,提问作者Tobias Feil
相关产品推荐
相关产品推荐

