我有一个 Golang 应用程序,它已经在本地编译并推送到生产服务器,但是当我尝试使用 systemd 服务设置它时,它不断收到权限被拒绝的错误,即使我使用 root 用户并且是整个应用程序的所有者应用程序文件夹和子文件夹。
我的应用程序位于文件夹路径“/home/my-user/app/src/my-app-api”,其中包含已编译的应用程序“my_api”(unix 可执行文件)和 .env。
/etc/systemd/system/my_api.service
[Unit]
Description=APP API
After=network.target
[Service]
User=root
Group=root
ExecStart=/home/my-user/app/src/my-app-api/my_api
WorkingDirectory=/home/my-user/app/src/my-app-api
EnvironmentFile=/home/my-user/app/src/my-app-api/.env
[Install]
WantedBy=multi-user.target
当我运行“sudo systemctl start my_api.service”时,它总是在“systemctl status my_api.service”中返回此错误
May 17 06:07:57 websitename systemd[1]: my_api.service: Failed to load environment files: Permission denied
May 17 06:07:57 websitename systemd[1]: my_api.service: Failed to run 'start' task: Permission denied
May 17 06:07:57 websitename systemd[1]: my_api.service: Failed with result 'resources'.
May 17 06:07:57 websitename systemd[1]: Failed to start APP API.
我已对应用程序文件夹和内容以及 .env 和 my_api.service 文件使用 chmod 777 -R。尝试使用 sudo 或非 sudo,使用 root 用户或其他用户、属于 root 用户和 root 组的文件夹和文件,但仍然遇到此错误。可能是什么原因造成的以及如何解决这个问题?预先感谢您。
正如原发帖者所述,这里的问题是 SELinux 权限问题。
我自己也遇到了这个问题,因为使用 SCP 将文件从一台服务器复制到另一台服务器,目标是我的主目录。之后,我将文件移动到服务器上的正确位置,但它保留了
user_home_t
上下文,直到阅读 Markus 的评论并使用 ls
标志运行 -Z
以便我可以看到SELinux 权限。就我而言,我可以运行诸如 sudo chcon -R -t unlabeled_t /myfile.file
之类的命令来纠正错误。
希望以答案形式提供的这些信息能够帮助遇到此问题或类似问题的其他人排除 SELinux 问题。感谢马库斯,他最初在原始问题的评论中发布了建议。
参考资料: