宝塔的“计划任务”不是拿来常驻的,它本质就是个 cron 定时器;“守护进程”如果面板里已经能直接加,那最省事,但很多版本底层就是 Supervisor 插件。你既然不想额外装 supervisor,就直接用系统自带的 systemd,开机自启和崩溃拉起一次配好,后面基本不用管。
先确认 Python 绝对路径和项目目录,比如:
which python3
**假设输出 /usr/bin/python3**
**项目目录假设是 /www/wwwroot/xxx**
建一个启动脚本 /www/wwwroot/xxx/run.sh:
cat >/www/wwwroot/xxx/run.sh <<'EOF'
#!/bin/bash
cd /www/wwwroot/xxx || exit 1
exec /usr/bin/python3 /www/wwwroot/xxx/xxx.py >> /www/wwwroot/xxx/run.log 2>&1
EOF
chmod +x /www/wwwroot/xxx/run.sh
注意 exec 别省,这样 systemd 管到的就是 Python 主进程。如果你用了虚拟环境,把 /usr/bin/python3 换成 /www/wwwroot/xxx/venv/bin/python。
然后建 systemd 服务:
cat >/etc/systemd/system/collector.service <<'EOF'
[Unit]
Description=My Python Collector
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/www/wwwroot/xxx
ExecStart=/www/wwwroot/xxx/run.sh
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
User=root 按你情况改,不确定就先用 root 跑通,想安全点改成 User=www,但要保证项目目录和日志文件 www 用户能写。
重载并启动:
systemctl daemon-reload
systemctl enable --now collector
systemctl status collector
看到 active (running) 和 enabled 就对了。日志看:
tail -f /www/wwwroot/xxx/run.log
想测试崩溃拉起,手动杀掉进程:
pkill -f "/usr/bin/python3 /www/wwwroot/xxx/xxx.py"
sleep 6
systemctl status collector
几秒后自己变回 running,就说明 Restart=always 生效了。
如果你非要用宝塔计划任务兜底,也能做,就是没那么实时。面板里“计划任务 → 添加任务 → Shell 脚本 → 每分钟”,脚本写:
#!/bin/bash
cd /www/wwwroot/xxx || exit 1
if ! pgrep -f "/usr/bin/python3 /www/wwwroot/xxx/xxx.py" >/dev/null 2>&1; then
nohup /usr/bin/python3 /www/wwwroot/xxx/xxx.py >> /www/wwwroot/xxx/run.log 2>&1 &
fi
这个方案开机后一分钟内会拉起,崩了最多空一分钟,适合懒得配 systemd 的情况。怕重复启动就加个 flock 锁。
面板里那个“守护进程”如果点进去能直接添加,就填绝对启动命令、运行目录,开自动重启和开机启动;要是提示你安装 Supervisor,那就别装了,直接用上面的 systemd。
几个坑:所有路径都写绝对路径,systemd 不读你 SSH 里的环境变量;脚本里别自己 fork 到后台,交给 systemd 前台跑;改了 service 文件必须 systemctl daemon-reload;配完直接 reboot 一次,回来 systemctl status collector 还是 running,就说明常驻和开机自启都成了。