无法通过systemd启动Python脚本:日志报错与环境问题排查
解决systemd启动Python脚本的两大问题:日志路径错误与虚拟环境未生效
看起来你碰到了两个典型的systemd运行Python脚本的问题,我来一步步帮你解决:
1. 日志路径导致的FileNotFoundError
从错误日志能看到,脚本试图访问/logs/mainserver.log,但你代码里写的是相对路径logs/mainserver.log——这是因为systemd默认的工作目录是根目录/,所以相对路径会从根目录开始解析,而不是你脚本所在的/home/ubuntu/app/backend/。
解决方法有两个,选一个就行:
- 方法一:在systemd单元文件里指定工作目录
在[Service]块里添加一行:
这样脚本运行时的工作目录就是脚本所在的文件夹,相对路径WorkingDirectory=/home/ubuntu/app/backendlogs/mainserver.log就会指向/home/ubuntu/app/backend/logs/mainserver.log,记得提前创建logs文件夹并给nobody用户读写权限:mkdir -p /home/ubuntu/app/backend/logs chown nobody:nogroup /home/ubuntu/app/backend/logs - 方法二:在Python脚本里用绝对路径
修改日志初始化代码,把日志路径改成绝对路径,比如:
同样要确保loghandler = TimedRotatingFileHandler('/home/ubuntu/app/backend/logs/mainserver.log', when="midnight")logs文件夹存在且权限正确。
2. 虚拟环境未生效,调用系统Python的问题
你已经在ExecStart里指定了虚拟环境的Python路径/home/ubuntu/app/env/bin/python,但还是调用了系统Python,大概率是权限问题:nobody用户可能没有访问虚拟环境目录的权限。
解决步骤:
- 先检查虚拟环境目录的权限,确保
nobody能进入并执行Python:ls -ld /home/ubuntu/app/env ls -l /home/ubuntu/app/env/bin/python - 如果权限不足,调整目录权限:
或者更安全的方式,把chmod -R 755 /home/ubuntu/app/envnobody用户加入到ubuntu组(假设目录属于ubuntu用户):usermod -aG ubuntu nobody chmod -R 775 /home/ubuntu/app/env - 另外,也可以在systemd单元文件里明确设置环境变量,确保虚拟环境的路径优先:
在[Service]块里添加:
这样系统会优先使用虚拟环境里的Python。Environment="PATH=/home/ubuntu/app/env/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
关于脚本的运行目录
默认情况下,systemd服务的运行目录是根目录/,除非你在[Service]块里通过WorkingDirectory参数指定了其他路径,就像我在第一个问题里建议的那样。
最后别忘了重启systemd服务让配置生效:
sudo systemctl daemon-reload sudo systemctl restart your-service-name.service
内容的提问来源于stack exchange,提问作者binrebin
相关产品推荐
相关产品推荐

