Running Node.Js as a systemd service
Monday, 16 November 2020
systemd is a software suite that provides an array of system components for Linux operating systems.
For us, it lets you run services, start them on boot then check and manage the status of them.
This is useful for making sure a node.js script is running whenever a raspberry pi is running.
To run through this I'll be installing a node.js app called
1 - Installing Node.js
Assuming you're starting from scratch, say from Raspbian lite, you'll need to install node first.
# Create and enter a temporary directory
# In the temp dir, get the node binaries and extract them
curl -sLO https://nodejs.org/dist/latest-v10.x/node-$VERSION.tar.gz
tar -xzf node-$VERSION.tar.gz
mv node-$VERSION /usr/src/node
# Link the binaries onto the $PATH
ln -s /usr/src/node/bin/node /usr/bin/node
ln -s /usr/src/node/bin/npm /usr/bin/npm
ln -s /usr/src/node/bin/npx /usr/bin/npx
# Clean the temporary directory
rm -r $TMP
Feel free to change the version of course, I used this older one as it supports armv6 on the Pi Zero I was installing on.
2 - Setup a user
We'll need a system user that the app will run as, we'll keep it simple and call them
Then we'll give them sudo and gpio access (this is a special group on Raspberry Pis)
and create a folder for the app to be in.
# Create the unix user
# Add them to groups
usermod -aG sudo node
usermod -aG gpio node
# Create a node-owned folder to put the app in
# You call this whatever you like, probably the name of your application
mkdir -p /usr/src/blinkit
chown -R node:node /usr/src/blinkit
3 - Checkout the the app's repo
Now you need to get the code that you want to run, and put it in that new folder.
# Become our new node user
# Clone the repo
git clone email@example.com:robb-j/blinkit.git /usr/src/blinkit
# Install the app's production dependencies
# There could be trouble here if any of your dependencies require extra binaries, like python
# You might need to debug you packages and see what they require a bit
npm install --production
4 - Create a systemctl service
To run with systemd we need a file which tells systemd how to run and manage our service.
blinkit I put this file inside the repo which is pulled down,
so it is available at
[Unit] Description=blinkit Documentation=https://github.com/robb-j/blinkit/ After=network.target [Service] Type=simple User=node ExecStart=/usr/bin/node /usr/src/blinkit/src/cli.js serve WorkingDirectory=/usr/src/blinkit Restart=on-failure [Install] WantedBy=multi-user.target
This service file is what systemd uses to know our application exists and what to do with it.
You should change the
WorkingDirectory statements to match your application.
Next we need to tell systemd about our new service. We will symlink the service file into the systemd directory, then restart the daemon and enable and start the new service.
# Your service name will be what you set `Description` to above
# Link the service file into place
sudo ln -s /usr/src/blinkit/blinkit.service /lib/systemd/system/blinkit.service
# Reload the daemon so it knows about the new file
sudo systemctl daemon-reload
# Enable our new service
sudo systemctl enable $SERVICE
# Start the service
sudo systemctl start $SERVICE
Now the new service should be running and doing whatever it does. You can check its output with:
# -f follows the logs in real time
# -u reverses the order so its newest first
journalctl -fu $SERVICE
If you restart your host, the service should now start up during the boot. Congratulations! 🎉