我正在尝试运行具有 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