Post

🛠 Creating a Linux service with systemd

Oftentimes writing application there is a need to offload compute-heavy tasks to an asynchronous worker script, schedule tasks for later, or even write a daemon that listens to a socket to communicate with clients.

The cool thing is that it’s fairly easy to create a Linux service: use your favorite programming language to write a long-running program, and turn it into a service using systemd.

systemd is a suite of basic building blocks for a Linux system. It provides a system and service manager that runs as PID 1 and starts the rest of the system. systemd provides aggressive parallelization capabilities, uses socket and D-Bus activation for starting services, offers on-demand starting of daemons, keeps track of processes using Linux control groups, maintains mount and automount points, and implements an elaborate transactional dependency-based service control logic. systemd supports SysV and LSB init scripts and works as a replacement for sysvinit. Other parts include a logging daemon, utilities to control basic system configuration like the hostname, date, locale, maintain a list of logged-in users and running containers and virtual machines, system accounts, runtime directories and settings, and daemons to manage simple network configuration, network time synchronization, log forwarding, and name resolution.

The last time when I need to run such a service it was a Python script to read temperature and humidity data from the XBee receiver connected to Raspberry Pi via USB.

To create a SERVICE_NAME service with systemd the following steps would be done:

  • create a unit file, e.g. SERVICE_NAME.service, like
1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Service Descrioption

[Service]
WorkingDirectory=/home/<user>/<directory>
ExecStart=<command to run>
Restart=always
RestartSec=10
SyslogIdentifier=<identifier>
User=<user>

[Install]
WantedBy=multi-user.target

Note : A real unit file example for Home Temperature Monitoring could be found here.

  • copy SERVICE_NAME.service to /etc/systemd/system/
  • make sure the script is executable chmod +x /etc/systemd/system/SERVICE_NAME.service
  • enable the service sudo systemctl enable SERVICE_NAME.service
  • start the service sudo systemctl start SERVICE_NAME.service
  • check the service’s status sudo systemctl status SERVICE_NAME.service

In my case I’ve used the minimum systemd features, more details about unit files could be found here https://www.freedesktop.org/software/systemd/man/systemd.unit.html

This post is licensed under CC BY 4.0 by the author.