Amazon Linux下cron执行Python脚本结束后进程处于睡眠状态咨询
问题解答
首先明确核心结论:你当前看到的Ss状态进程不是僵尸进程,僵尸进程的状态标记为Z(Zombie),和你观测到的状态有本质区别。
进程残留的原因
你ps输出中显示的/bin/bash -c /usr/bin/python /home/myuser/my_script.py是cron启动的父bash进程,而非你的Python脚本本身:
- cron执行你配置的命令时,会先启动一个bash shell进程,再由该bash进程fork出Python子进程执行你的脚本
- 你观测到的打印输出正常,说明Python子进程已经执行完成并退出,残留的是未正常退出的父bash进程,处于可中断睡眠状态等待资源释放
虚拟环境和cron是否会导致僵尸进程
虚拟环境本身不会触发僵尸进程,cron原生机制也不会产生僵尸进程。僵尸进程只会在「子进程退出后,父进程没有调用wait()系统调用回收子进程PCB资源」的场景下出现,你当前的场景不属于僵尸进程范畴。
父bash进程残留通常和你cron命令的写法、虚拟环境激活逻辑有关:
- 如果你cron中采用了先激活虚拟环境再执行脚本的写法,激活虚拟环境的shell脚本如果存在未关闭的文件描述符、未退出的后台附属进程,就会导致父bash进程无法收到退出信号,卡在睡眠状态
- 如果你的Python脚本内部启动了未脱离会话的后台子进程,父bash进程会等待所有子进程完全退出后才会终止,也会出现残留
修复方案
- 优先推荐直接使用虚拟环境的Python解释器绝对路径执行脚本,无需显式激活虚拟环境,可完全避免多余的父bash进程残留,示例cron命令如下:
* * * * * /home/myuser/你的虚拟环境目录/bin/python /home/myuser/my_script.py - 如果必须显式激活虚拟环境,可在命令末尾加
exit强制bash进程执行完成后退出:* * * * * source /home/myuser/你的虚拟环境目录/bin/activate && python /home/myuser/my_script.py && exit - 排查Python脚本内部是否存在未关闭的句柄、未终止的后台子进程,这类资源持有也会导致父进程无法正常退出
内容的提问来源于stack exchange,提问作者Jeanne Lane
相关产品推荐
相关产品推荐

