Ubuntu系统下如何自动重启崩溃的Python脚本(EC2场景)
可行实现方案
以下两种方案均可以满足你崩溃自动重启、不启动重复实例的需求,可根据你的使用习惯选择:
方案1:Systemd进程托管(推荐)
Linux系统原生的systemd服务天生支持进程异常自动重启,无需手动编写校验逻辑,可靠性最高,也可以完美适配你原有的每日重启需求。
操作步骤:
- 新建service配置文件,路径为
/etc/systemd/system/python_script.service,填写如下内容,替换尖括号内的占位符为你自己的实际路径:
[Unit] Description=My Python running script After=network.target [Service] User=<你的EC2登录用户名,比如ubuntu/ec2-user> WorkingDirectory=<你的脚本所在目录的绝对路径> ExecStart=<Python解释器的绝对路径,比如/home/ubuntu/venv/bin/python3> <你的Python脚本绝对路径> Restart=always RestartSec=5 # 异常退出后5秒自动重启,可根据需求调整间隔时长 [Install] WantedBy=multi-user.target
- 执行以下命令启用服务:
- 重载systemd配置:
sudo systemctl daemon-reload - 启动服务:
sudo systemctl start python_script.service - 如需开机自动启动:
sudo systemctl enable python_script.service
- 适配原有每日重启逻辑:只需要在crontab加一条定时重启服务的任务即可,比如每天凌晨1点重启:
0 1 * * * sudo systemctl restart python_script.service - 排查问题可查看实时日志:
journalctl -u python_script.service -f
方案2:Crontab加防重入校验(适配你原有思路)
如果你不想改动现有配置,想直接用高频crontab触发,只需在启动命令中加防重入逻辑即可,保证同一时间只有一个实例运行:
方式A:flock文件锁(最稳妥)
利用Linux自带的flock工具实现文件锁,只要脚本正在运行,锁就会被占用,后续触发的任务拿不到锁会直接退出,不会启动新实例。
crontab配置示例(每2分钟触发一次,可调整间隔):*/2 * * * * /usr/bin/flock -n /tmp/my_python_script.lock <Python解释器绝对路径> <脚本绝对路径>
参数说明:-n 代表非阻塞模式,获取不到锁直接退出,不会产生等待队列。
方式B:进程名匹配校验
通过pgrep匹配正在运行的脚本进程,没有匹配结果才启动新实例:
crontab配置示例:*/2 * * * * pgrep -f "<你的脚本绝对路径>" > /dev/null || <Python解释器绝对路径> <脚本绝对路径>
注意:脚本路径要写绝对路径,避免和其他同名进程混淆产生误判。
内容的提问来源于stack exchange,提问作者SSC Fan
相关产品推荐
相关产品推荐

