Skip to content

Instantly share code, notes, and snippets.

@leommoore
Last active April 25, 2024 02:46
Show Gist options
  • Star 15 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save leommoore/ea74061dc3bb086f36d42666a6153e0c to your computer and use it in GitHub Desktop.
Save leommoore/ea74061dc3bb086f36d42666a6153e0c to your computer and use it in GitHub Desktop.
Systemd Services 101

Check that your system supports systemd

pidof systemd
2733

If this return a number then your system supports systemd. Most Linux distributions in 2017 support systemd.

Check out the proceses currently running.

Since systemd starts the process then all processes will be children of systemd

pstree -p

The result should be a tree list of all the currently running processes.

To create a new service

Create a bash script

This simple script (hello-world.sh) just outputs hello world every 30 seconds.

#!/bin/bash

while $(sleep 30);
do
    echo "hello world"
done

Make the file executable

chmod a+x hello-world-service.sh

This command can now be run from the command line but it is not yet running as a service.

Create the Service

Create the service file hello-word.service in /etc/systemd/system/.

sudo /etc/systemd/system/hello-word.service

Put he following into the .service file.

[Unit]
Description=Hello World Service
After=systend-user-sessions.service

[Service]
Type=simple
ExecStart=/home/leo/Projects/test/hello-world.sh

The service file is typically divided into two parts.

The Unit section defines the basic information about the service such as the description and when to run the service. In this case the After line tells systemd that it should wait for the user sessions to start but it could be started before that too if required.

The Service section tells that the type is simple and the command to run. You could also set the type=forking for services which handle their own daemonization. Basically if you run the command and it keeps sending output to the screen then it is a simple type whereas if it runs in the background then it is a forking type. Note: You must use an absolute path for the location of the command. You cannot use ~/Projects/test/hello-world.sh.

Starting the Service

Once the .system file has been created in the /etc/systemd/system directory, you can start the service using:

sudo systemctl start hello-world.service

Check the Service Status

systemctl status hello-world.service

View the logs

journalctl -u hello-world -e

The -u flag tells which service and the -e flag tells it to start at the end of the file and work back.

Jun 24 13:27:23 leo-500-136ea hello-world.sh[27611]: hello world
Jun 24 13:27:53 leo-500-136ea hello-world.sh[27611]: hello world
Jun 24 13:28:23 leo-500-136ea hello-world.sh[27611]: hello world

You can also add the following line the Service section of to replace the hello-world.sh with a more descriptive tag in the log files. For example you could do:

SyslogIdentifier=HelloWorldService

So the resulting file would look like:

[Unit]
Description=Hello World Service
After=systend-user-sessions.service

[Service]
Type=simple
ExecStart=/home/leo/Projects/test/hello-world.sh
SyslogIdentifier=HelloWorldService

So the log file now looks like:

Jun 24 13:39:56 leo-500-136ea HelloWorldService[28037]: hello world
@dhbradshaw
Copy link

This is really useful. Thanks for putting it up.

I made a few minor edits on a fork but it looks like gists can't currently do pull requests. Anyway, if you want to copy the edits they're at https://gist.github.com/dhbradshaw

@CarlFK
Copy link

CarlFK commented Mar 22, 2019

sudo vim /etc/systemd/system/hello-word.service

After=systemd-user-sessions.service systemd not systend

@jackmahoney
Copy link

Helpful gist thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment