使用 Sudo 启动服务

使用 Sudo 启动服务

我正在尝试运行具有 sudo 权限的 Express API 服务器并让它在启动时自动启动。

API 需要访问 bcm2835 库,当我尝试运行 node server.js 时,我收到以下信息

bcm2835_init:无法打开/dev/mem:权限被拒绝/home/pi/Documents/node_modules/rpio/lib/rpio.js:104
返回bindfunc(optarg);

错误:无法
在 bindcall (/home/pi/...) 等处初始化 bcm2835 库。

但是,它可以在运行 sudo node server.js 时正常启动。

我在 /etc/systemd/system 创建了一个服务文件,如下所示:

[Unit]
Description=Node API
After=network.target

[Service]
ExecStart=/usr/bin/node /home/pi/Documents/server.js
Restart=always
SyslogIdentifier=controller
User=root
Group=root
Environment=

TimeoutStopSec=30

[Install]
WantedBy=multi-user.target

我在这里和这里找到了一些指导,但它们似乎有点偏离,因为子命令需要 sudo/root 权限。

从命令行运行时,service controller start它会提示输入用户名和密码。

我如何以适当的权限运行此服务以便它与 Pi 一起启动?

答案1

您需要在 sudoers 文件中允许以下命令:

systemctl start <your-systemd-service>

systemctl stop <your-systemd-service>

systemctl restart <your-systemd-service>

systemctl enable <your-systemd-service>

不要使用服务命令。

记得用你的 systemd 服务替换服务名称。例如,如果你的服务文件的名称为:

/etc/systemd/system/controller.service

那么它应该是:

systemctl start controller.service

systemctl stop controller.service

systemctl restart controller.service

systemctl enable controller.service

此外,您还需要执行以下操作:

systemctl daemon-reload

将服务文件放入 systemd 后

在 sudoers 中添加通用命令:

https://www.atrixnet.com/allow-an-unprivileged-user-to-run-a-certain-command-with-sudo/

示例命令:

<your-user> ALL=(ALL) NOPASSWD: /usr/bin/systemctl start controller.service

相关内容