Ubuntu系统中启动应用程序内脚本崩溃后的自动重启方案及Python脚本相关疑问
先直接给你个明确答案:Ubuntu 20.04的Startup Applications不会自动重启崩溃的脚本。它的作用只是在你登录系统时帮你启动一次程序,没有监控程序运行状态、崩溃后自动重启的能力。
接下来给你几个靠谱的解决办法,按推荐程度排序:
方法一:用systemd服务(推荐,Ubuntu原生支持)
systemd是Ubuntu默认的初始化系统,自带进程监控和重启机制,非常适合你的场景。
创建一个systemd服务配置文件,比如
frigate-sms.service,路径放在/etc/systemd/system/下:[Unit] Description=Frigate MQTT SMS Trigger Service After=network.target [Service] User=你的用户名 # 替换成实际登录Ubuntu的用户名 WorkingDirectory=/path/to/your/script/folder # 替换成Python脚本所在的目录 ExecStart=/usr/bin/python3 /path/to/your/script/your_script.py # 替换成脚本的完整路径 Restart=always # 不管程序以什么原因退出,都自动重启 RestartSec=5 # 崩溃后等待5秒再重启,避免频繁重启 StandardOutput=journal+console # 日志输出到journalctl,方便排查问题 StandardError=journal+console [Install] WantedBy=multi-user.target保存文件后,执行以下命令让systemd识别这个服务:
sudo systemctl daemon-reload设置服务开机自启:
sudo systemctl enable frigate-sms.service现在就可以启动服务了:
sudo systemctl start frigate-sms.service
以后如果脚本崩溃,systemd会自动帮你重启。你可以用journalctl -u frigate-sms.service -f来实时查看脚本的日志,排查问题。
方法二:用Supervisor进程管理工具
Supervisor是专门用来监控和管理进程的工具,配置起来也很简单。
先安装Supervisor:
sudo apt update && sudo apt install supervisor创建一个配置文件,比如
frigate-sms.conf,放在/etc/supervisor/conf.d/下:[program:frigate-sms] command=/usr/bin/python3 /path/to/your/script/your_script.py directory=/path/to/your/script/folder user=你的用户名 autostart=true autorestart=true # 崩溃自动重启 startretries=3 # 启动失败重试3次 stdout_logfile=/var/log/frigate-sms.log # 日志文件路径 stderr_logfile=/var/log/frigate-sms.err.log重新加载Supervisor配置并启动服务:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start frigate-sms
你可以用supervisorctl status frigate-sms查看脚本状态,用supervisorctl restart frigate-sms手动重启。
方法三:简单的Shell脚本循环(适合快速测试)
如果不想折腾服务管理工具,可以写个简单的shell脚本,让它循环检查Python脚本是否运行,没运行就启动。
创建一个
restart_script.sh文件:#!/bin/bash while true; do # 检查脚本是否在运行,没运行就启动 if ! pgrep -f "your_script.py" > /dev/null; then echo "脚本崩溃,正在重启..." >> /var/log/frigate-sms-restart.log /usr/bin/python3 /path/to/your/script/your_script.py fi sleep 10 # 每10秒检查一次 done给脚本加执行权限:
chmod +x restart_script.sh把这个shell脚本添加到Startup Applications里,这样登录后它就会一直监控你的Python脚本,崩溃了就重启。
不过这个方法不如前两种可靠,比如如果脚本被强制杀死,或者进程名冲突可能会失效,适合临时用用。
备注:内容来源于stack exchange,提问作者j zeng

