0

I am trying to run an Express API server with sudo permissions and have it automatically start on boot.

The API needs access to bcm2835 library, and I get the following when trying to run node server.js

bcm2835_init: Unable to open /dev/mem: Permission denied /home/pi/Documents/node_modules/rpio/lib/rpio.js:104
return bindfunc(optarg);

Error: Could not initialize bcm2835 library
at bindcall (/home/pi/...) etc.

However it boots up fine running sudo node server.js.

I have created a service file at /etc/systemd/system as follows:

[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

I found some guidance here and here, but they seem slightly off, since a sub-command needs sudo/root privileges.

When running service controller start from the command line it prompts for a username and password.

How can I run this service with proper permissions so it boots up with the Pi?

  • Your script is the issue! – George Udosen Nov 1 '18 at 17:40
  • I see... How do I give the proper permissions to the script? – Matthew Nov 1 '18 at 18:39
  • No, the "asking for password" is the issue and I assume controller is your script! – George Udosen Nov 1 '18 at 19:26
  • server.js is my script that calls /home/pi/Documents/node_modules/rpio/lib/rpio.js – Matthew Nov 1 '18 at 19:48
  • I'm not sure what you mean by "no"... – Matthew Nov 1 '18 at 19:49
0

you need to allow the following commands in the sudoers file:

systemctl start <your-systemd-service>

systemctl stop <your-systemd-service>

systemctl restart <your-systemd-service>

systemctl enable <your-systemd-service>

dont use the service command.

Remember to replace the service name with your systemd service. For example if your service file is with name:

/etc/systemd/system/controller.service

then it should be:

systemctl start controller.service

systemctl stop controller.service

systemctl restart controller.service

systemctl enable controller.service

also , you will need to do:

systemctl daemon-reload

after you place you service file in systemd

Adding commonads in sudoers:

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

example command:

<your-user> ALL=(ALL) NOPASSWD: /usr/bin/systemctl start controller.service
  • Where is the sudoers file? – Matthew Nov 1 '18 at 20:03
  • just type visudo as root , it will open the config file and u need to allow your user thoese commands – Ijaz Ahmad Khan Nov 1 '18 at 20:04
  • remember to replace the service name with the name of your systemd service – Ijaz Ahmad Khan Nov 1 '18 at 20:05
  • I get an error after I save the file, >>> /etc/sudoers: syntax error near line 15 and so on for each line I try to add. – Matthew Nov 1 '18 at 20:10
  • How do I edit as root when I'm logged in as another user? – Matthew Nov 1 '18 at 20:10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.