树莓派Python脚本启动时杀其他实例:VS Code RemoteSSH异常解决
VS Code Remote SSH启动脚本时误杀进程的原因与解决方法
问题原因
当通过VS Code Remote SSH启动或调试Python脚本时,VS Code会启动一个调试适配器进程(比如debugpy)来代理脚本运行,这个调试进程的命令行参数里会包含test.py(例如python3 -m debugpy --listen 0.0.0.0:5678 test.py)。
你使用的pgrep -f test.py是基于整个命令行文本做模糊匹配,所以会同时抓出两个PID:
- 实际运行
test.py的Python进程(当前脚本的PID) - VS Code的调试适配器进程(命令行含
test.py)
脚本会把调试适配器进程当成"其他实例"杀掉,但调试适配器是当前Python进程的父进程,父进程被kill -9强制终止后,当前脚本进程会被系统直接回收,导致脚本意外终止。
解决方法
方法1:精确匹配进程命令行
修改pgrep的匹配规则,只匹配直接运行脚本的Python进程,过滤掉调试进程:
import os import subprocess def killOtherScriptInstances(): myPID = os.getpid() # 只匹配以python3开头、结尾是test.py的进程 pids = list(map(int, subprocess.check_output( 'pgrep -f \'^python3 .*test.py$\'', shell=True ).decode('UTF-8').splitlines())) for pid in pids: if pid != myPID: subprocess.run(['kill', '-9', str(pid)], check=True) killOtherScriptInstances()
如果是用相对路径直接运行python3 test.py,可以把匹配规则改成'^python3 test.py$',进一步缩小匹配范围。
方法2:用脚本绝对路径精准匹配
通过获取脚本的绝对路径,只匹配命令行中包含该完整路径的进程,避免误匹配调试进程:
import os import subprocess import sys def killOtherScriptInstances(): myPID = os.getpid() # 获取当前脚本的绝对路径 script_full_path = os.path.abspath(sys.argv[0]) # 过滤出包含绝对路径的进程,排除grep自身和当前进程 ps_output = subprocess.check_output( f"ps aux | grep '{script_full_path}' | grep -v grep | grep -v {myPID}", shell=True ).decode('UTF-8').splitlines() for line in ps_output: pid = int(line.split()[1]) subprocess.run(['kill', '-9', str(pid)], check=True) killOtherScriptInstances()
这种方式可靠性更高,因为VS Code的调试进程命令行里一般不会包含脚本的完整绝对路径。
方法3:避免强制终止(可选)
除非必要,尽量不要用kill -9,可以先用kill -15(默认终止信号)让进程优雅退出,减少意外问题:
subprocess.run(['kill', '-15', str(pid)], check=True)
内容的提问来源于stack exchange,提问作者J R
相关产品推荐
相关产品推荐

