Process Detachment问题:Wezterm启动脚本后MPV随终端关闭的解决方法
问题分析与解决方案
差异原因
两种场景的核心区别在于进程组的归属:
- 场景A:手动打开终端运行脚本时,脚本是终端的子进程,MPV是脚本的子进程。脚本运行完毕后,MPV的父进程会被系统(init/systemd)接管,此时MPV不属于终端的进程组。关闭终端时,系统只会向终端自身的进程组发送终止信号(SIGHUP),MPV不受影响,因此能继续运行。
- 场景B:用
wezterm start -e python ...启动时,Python脚本是Wezterm终端的直接子进程,MPV属于这个脚本所在的进程组。终端关闭时,系统会向整个进程组发送SIGHUP信号,MPV收到信号后就会终止。
解决方法
方法1:让MPV创建新会话(推荐)
修改Python代码,给subprocess.Popen添加start_new_session=True参数,让MPV脱离原进程组,创建独立的会话:
p = subprocess.Popen(["/usr/bin/mpv", link], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT, start_new_session=True)
这个参数会让MPV成为新会话的领头进程,不再受原终端进程组的信号影响。
方法2:用setsid命令启动MPV
在启动MPV的命令前加上setsid,同样可以让MPV脱离原进程组:
p = subprocess.Popen(["setsid", "/usr/bin/mpv", link], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
setsid会创建新的会话和进程组,让MPV独立运行。
方法3:修改Wezterm启动命令(补充方案)
如果不想修改Python脚本,可以在Wezterm的启动命令里让脚本后台运行并脱离终端关联:
/usr/bin/wezterm start -e bash -c "python /script/path/here & disown"
不过这种方式需要额外的shell处理,不如前两种直接。
内容的提问来源于stack exchange,提问作者Ghost
相关产品推荐
相关产品推荐

