使用systemd启动virtualenv环境中Python脚本提示Permission denied怎么解决
排查与解决步骤
1. 检查全路径执行权限
仅给虚拟环境内的Python二进制设置777权限没用,需要确保从根目录到Python二进制的每一级父目录,都对配置文件中指定的User用户开放执行(x)权限,systemd启动时需要逐层访问到目标二进制文件:
# 查看全路径的权限配置 namei -l /home/<my-user>/.virtualenvs/myvenv/bin/python
如果中间某一级目录缺少执行权限,执行下方命令补全权限即可:
chmod o+x /home/<my-user>/.virtualenvs /home/<my-user>/.virtualenvs/myvenv /home/<my-user>/.virtualenvs/myvenv/bin
2. 排查SELinux限制
Fedora系统默认开启SELinux,默认规则会禁止系统级systemd服务执行用户家目录下的二进制文件,这是该场景下最常见的报错原因。你可以先临时关闭SELinux验证是否为该问题导致:
setenforce 0 # 重载配置后重启服务测试 systemctl daemon-reload systemctl restart test.service
如果测试后服务可以正常启动,不要直接永久关闭SELinux,给虚拟环境的Python二进制添加对应安全上下文即可:
semanage fcontext -a -t bin_t '/home/<my-user>/.virtualenvs/myvenv/bin/python(\..*)?' restorecon -Rv /home/<my-user>/.virtualenvs/myvenv/bin/ # 恢复SELinux开启状态 setenforce 1
3. 服务配置优化
你当前的服务配置逻辑没有问题,有两个细节调整可以避免后续异常:
- 自定义服务不要放在
/usr/lib/systemd/system/目录下,该目录为系统默认服务的存放路径,自定义服务建议放在/etc/systemd/system/目录下 - 你当前的ExecStart写法已经可以直接调用虚拟环境内的Python,不需要额外配置PATH环境变量
4. 最终验证
完成上述调整后执行以下命令验证服务状态:
systemctl daemon-reload systemctl start test.service systemctl status test.service
内容的提问来源于stack exchange,提问作者WayneNani
相关产品推荐
相关产品推荐

