You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:32:38