Celery停止了任务却未关闭子进程,怎么破?

Celery停止了任务却未关闭子进程,怎么破?
Page content

这问题似乎挺棘手的,毕竟我所进行的任务是通过celery下发给subprocess的。在查阅了资料我有了解决办法,以下是简化后的代码便于理解

🍺本篇文章大约需要1分钟来阅读,届时你或许将学到:

  • 杀死子进程

首先,我们获取该进程的PID,这很重要。

def run_code(code):
    return Popen(code,shell=True).pid

然后我们通过类似如下命令(可能写得比较烂)找出所有子进程的PID,例如父进程PID66687

ps -ef|grep 66687|awk '{print $2,$3}'|grep ' 66687'|awk '{print $1}'

于是我们编辑代码退出方法如下。

def kill_proc(pid):
    Popen(f"kill -9 `ps -ef|grep {pid}|awk"+ " '{print $2,$3}'|grep ' "+f"{pid}'|awk '"+"{print $1}'`",shell=True).wait()

希望这能帮到你,如有疑问请联系我。