Python项目后台服务托管设置:从零配置自启动守护进程
开发好的Python项目如果只是跑在终端里,关掉窗口或掉线就会终止。
想要稳定运行,需要把项目注册为系统后台服务。
本文从零演示两种最常用的托管方式:systemd(CentOS 7+/Ubuntu 16+自带)和supervisor(更通用的进程管理工具),适合新手直接照做。
先确认这三样东西
动手前检查下面几项:
- 服务器系统:推荐Ubuntu 20.04+或CentOS 7+,本文命令基于这两类系统。
- Python环境:确认项目需要的Python版本已安装,且虚拟环境已激活。
- 项目入口:定位到你的启动脚本,例如
/home/myuser/project/app.py,确保能手动python app.py正常运行。 - sudo权限:注册服务需要root或sudo。
如果项目依赖第三方包,先 pip install -r requirements.txt 安装好。
用systemd写一个.service文件
systemd是大多数现代Linux发行版的服务管理器。
创建一个服务单元文件:
sudo vim /etc/systemd/system/myproject.service
写入以下内容(请替换路径和用户名):
[Unit]
Description=My Python Project Service
After=network.target
[Service]
User=myuser
WorkingDirectory=/home/myuser/project
ExecStart=/home/myuser/project/venv/bin/python /home/myuser/project/app.py
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
关键字段解释:
User:运行服务的系统用户,避免使用root。WorkingDirectory:项目目录,方便路径引用。ExecStart:启动命令,一定要用虚拟环境中的Python解释器,否则可能报模块找不到。Restart=always:进程意外退出后自动重启。RestartSec=5:重启前等待5秒。
保存文件后执行:
sudo systemctl daemon-reload
sudo systemctl enable myproject.service # 设置开机自启
sudo systemctl start myproject.service # 启动服务
备选方案:用supervisor托管
如果服务器是旧系统或你想统一管理多个Python进程,supervisor更灵活。
安装:
# Ubuntu/Debian
sudo apt install supervisor -y
# CentOS/RHEL
sudo yum install supervisor -y
生成配置文件,推荐写在 /etc/supervisor/conf.d/ 下:
sudo vim /etc/supervisor/conf.d/myproject.conf
内容示例:
[program:myproject]
command=/home/myuser/project/venv/bin/python /home/myuser/project/app.py
directory=/home/myuser/project
user=myuser
autostart=true
autorestart=true
startsecs=5
stderr_logfile=/var/log/myproject.err.log
stdout_logfile=/var/log/myproject.out.log
加载并启动:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start myproject
之后用 sudo supervisorctl status 查看所有进程状态。
常踩的坑和解决办法
- 报错 ModuleNotFoundError:检查service中的
ExecStart是否用了全局Python而非虚拟环境的。建议用which python确认虚拟环境路径。 - 权限不足:日志路径、目录读写权限记得给
User指定用户。如果服务用root启动,之后改日志目录可能会报Permission denied。 - 环境变量缺失:如果代码读取了
.env文件或环境变量,在systemd的[Service]段加EnvironmentFile=/path/to/.env。 - systemd启动失败但无提示:运行
sudo journalctl -u myproject.service -n 30查看具体错误。 - supervisor启动后进程一直重启:检查
command是否写对了,或者程序本身启动后立即退出,可先在终端手动跑一次看输出。
验证服务是否在后台跑
无论用systemd还是supervisor,确认服务正常运行的方法:
- 用
curl或浏览器访问项目提供的端口(如Flask的5000,Django的8000)。 - 检查进程存在:
ps aux | grep python应该看到你的项目进程。 - 关机重启后,再次登录执行
systemctl status myproject或supervisorctl status,状态应为active (running)。 - 故意杀死进程:
sudo kill,观察systemd或supervisor会自动拉起来。
如果你正在处理Python项目后台服务托管设置,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
把服务注册好后,后续更新代码只要重启服务就好,非常省心。