如何用subprocess终止开机启动程序?Flask路由实现疑问
如何用subprocess(或其他方法)终止Cron开机启动的程序
嘿,我来帮你搞定这个问题!首先得说清楚:你之前试的subprocess.Popen相关代码之所以没用,是因为那段代码只适用于你自己用当前进程启动的子进程——而你的facedetection.py是Cron开机启动的,和Flask进程完全是独立的两个进程,Flask根本拿不到那个进程的Popen实例,自然没法直接调用terminate()。
另外你问的“直接将程序名赋值给extProc = program_name是否可行?”——答案是完全不行,extProc需要是subprocess.Popen的实例对象,不是字符串,所以这种赋值方式没有任何意义。
下面给你两种可行的解决方案,都能在Flask路由里实现终止目标进程:
方案一:用psutil库(推荐,更Pythonic)
psutil是一个专门用于进程管理的Python库,能轻松查找和操作系统进程。首先需要安装它:
pip install psutil
然后在你的Flask路由里这样写:
@app.route("/killFD", methods=['GET', 'POST']) def killFaceDetector(): import psutil for proc in psutil.process_iter(['pid', 'cmdline']): try: # 检查进程的命令行是否包含目标脚本的完整路径(避免误杀同名进程) if '/home/pi/Desktop/startUpPrograms/facedetection.py' in proc.info['cmdline']: # 先尝试温和终止进程 proc.terminate() # 如果需要强制终止,可以替换成 proc.kill() return "人脸检测进程已成功终止!" except (psutil.NoSuchProcess, psutil.AccessDenied): # 进程可能已经结束,或者没有权限操作,直接跳过 continue return "未找到人脸检测进程!"
方案二:用subprocess调用系统命令(依赖Linux工具)
在Raspberry Pi的Linux环境下,你可以用subprocess调用pkill、kill这类系统命令来终止进程。比如用pkill的-f参数匹配完整命令行:
@app.route("/killFD", methods=['GET', 'POST']) def killFaceDetector(): import subprocess # 用pkill匹配包含目标脚本路径的进程 result = subprocess.run( ['pkill', '-f', '/home/pi/Desktop/startUpPrograms/facedetection.py'], capture_output=True, text=True ) if result.returncode == 0: return "人脸检测进程已成功终止!" else: return f"终止进程失败:{result.stderr}"
如果不想用pkill,也可以通过ps和grep组合找到进程PID再执行kill:
@app.route("/killFD", methods=['GET', 'POST']) def killFaceDetector(): import subprocess try: # 获取所有进程信息 proc_list = subprocess.check_output(['ps', 'aux'], text=True) for line in proc_list.splitlines(): if '/home/pi/Desktop/startUpPrograms/facedetection.py' in line: # 提取进程PID(ps aux输出的第二列是PID) pid = line.split()[1] # 执行kill命令终止进程 subprocess.run(['kill', pid], check=True) return "人脸检测进程已成功终止!" return "未找到人脸检测进程!" except subprocess.CalledProcessError as e: return f"终止进程时出错:{e}"
内容的提问来源于stack exchange,提问作者Shyam3089
相关产品推荐
相关产品推荐

