我们有一个基于 Nodejs 的服务器,配置为由 systemd 启动,并且在我们的开发服务器上通过持续集成部署新版本。我们遇到的问题是非root用户无法使用systemctl命令重新启动应用程序,所以我们很好奇应该如何解决这个问题?
我们尝试过的命令:
sudo systemctl start my-nodejs-server
systemd 脚本的内容:
[Unit]
Description=NodeJS Based Server
[Install]
WantedBy=multi-user.target
[Service]
User=myserver-user
Group=myserver-userh
Environment=ENV=production NODE_ENV=production
WorkingDirectory=/home/myserver-user/my-nodejs-server/
#ExecStart=/home/myserver-user/my-nodejs-server/scripts/appctl.sh restart
ExecStart=/usr/bin/node lib
Restart=on-failure
我还按照建议尝试了以下命令:
systemctl --user start my-nodejs-server
但我得到以下信息:
Failed to connect to bus: No such file or directory
有任何想法吗?
我们正在 Ubuntu 16 上运行。
答案1
根据我的需要,需要“系统单元文件”,而不是“用户单元文件”(请参阅这里),因为后者位于用户的主目录中,并且仅适用于在登录会话期间运行的程序。
我最终采用的解决方案在以下答案中描述:
本质上,您授予用户 sudo 运行特定命令的权限。这里是:
myserver-user ALL= NOPASSWD: /bin/systemctl start my-nodejs-server
myserver-user ALL= NOPASSWD: /bin/systemctl stop my-nodejs-server
myserver-user ALL= NOPASSWD: /bin/systemctl restart my-nodejs-server
请注意,如果您想将此权限应用于组,请在标识符前面使用百分比符号,如下所示:
%myserver-group ALL= NOPASSWD: /bin/systemctl start my-nodejs-server
%myserver-group ALL= NOPASSWD: /bin/systemctl stop my-nodejs-server
%myserver-group ALL= NOPASSWD: /bin/systemctl restart my-nodejs-server
另外,根据引用的答案,我可能会将部署用户更改为deployment
或类似的用户,以避免部署用户与运行应用程序的用户相同。