如何实现Python脚本在其启动的所有程序关闭后自动终止?
解决脚本在所有子进程关闭后自动终止的问题
原代码的问题分析
back_insert函数逻辑错误:函数中判断if flist == " "永远不成立(flist是字符列表,而" "是字符串),导致路径中的空格根本没被转义。更关键的是,这个函数完全没必要——subprocess.Popen支持直接传递列表形式的命令,会自动处理带空格的路径,无需手动添加反斜杠。- 进程等待方式可能导致异常挂起:如果某个启动的程序会fork子进程(父进程退出后子进程继续运行),或者进程变成僵尸状态,
p.wait()可能无法正确识别进程已终止,导致脚本卡住。
修正后的代码
import subprocess from subprocess import Popen import time # 直接定义程序路径,无需手动转义空格 commands = [ "/bin/QUsb2Snes", "/home/user/LibreSplit/libresplit", "/usr/share/OpenTracker/OpenTracker", "/usr/bin/snes9x-gtk" ] # 启动所有进程:用列表形式传递命令,自动处理空格,避免shell注入风险 procs = [] for cmd in commands: # 直接以列表形式传递命令,subprocess会自动处理路径中的空格 proc = Popen([cmd]) procs.append(proc) # 循环检查所有进程是否已终止 while True: all_terminated = True for p in procs: # poll()返回None表示进程仍在运行,否则返回退出码 if p.poll() is None: all_terminated = False break if all_terminated: print("所有程序已关闭,脚本退出") break # 每秒检查一次,避免占用过多资源 time.sleep(1)
关键改进点
- 移除无效的路径转义函数:使用
subprocess.Popen的列表参数模式,既安全又能自动处理路径空格。 - 主动检查进程状态:通过循环调用
poll()判断进程是否存活,确保所有进程真正终止后再退出脚本,避免因进程特殊行为导致的挂起。 - 避免shell注入风险:不使用
shell=True,直接传递命令列表是subprocess模块的推荐用法。
内容的提问来源于stack exchange,提问作者Believe82
相关产品推荐
相关产品推荐

