Home |  Electronics |  Toolbox |  Gini and Karl's world |  E-cards |  Photos |  Online-Shop

story time | science club | math blog | computer corner | penguin page | Antoin's blog

Linux: systemd in a nutshell

I have been very skeptic about systemd and why one would need to replace the existing init scripts. It was easy to add or change things in those init scripts and they did the job. However when you change from a system with init scripts to one based on systemd you notice immediately a big difference: startup time. Systemd boots a lot faster. My Thinkpad boots in under 10s with systemd. Even an optimized init script based system will need more than 20s on the same machine.

OK, now I have systemd but how do I use it? You can find a lot of general documentation about using systemd at https://www.freedesktop.org/wiki/Software/systemd/ and Arch linux has a very nice tutorial https://wiki.archlinux.org/index.php/systemd. Your basic command for managing systemd is systemctl:

systemctl list-units systemctl status NAME_OF_SERVICE systemctl stop NAME_OF_SERVICE systemctl start NAME_OF_SERVICE systemctl disable NAME_OF_SERVICE systemctl enable NAME_OF_SERVICE systemctl mask NAME_OF_SERVICE (permanently disable service) systemctl unmask NAME_OF_SERVICE systemctl list-unit-files
systemctl can not only reboot the computer but put it to sleep or power it off:
systemctl reboot systemctl suspend systemctl poweroff

Linux: how to write your own systemd scripts (unit files)

Case 1: You want to start your own server processes via systemd.

These processes are simply started as:
your_cmd 1 & your_cmd 2 & your_cmd 3 &

There is no overall daemon that supervises everything.

To stop this process you would run
killall your_cmd
To integrate this very primitive service to systemd you write two scripts. One script for startup and one to stop the processes:
#!/bin/bash # This is /usr/bin/your_cmd-start.sh # start script for your_cmd your_cmd 1 & your_cmd 2 & your_cmd 3 &
#!/bin/bash # This is /usr/bin/your_cmd-stop.sh # stop script for your_cmd killall -w your_cmd
This is the basic framework of our process and it could be any simple script based server process. It does not really matter what it exactly does. The important part is that there is a script to start it and after having executed that script the process is running. There is as well a script to stop the whole thing.

To integrate this into systemd you write a short text file called unit file and you copy this file to /usr/lib/systemd/system/. The file name must end in .service:
vi /usr/lib/systemd/system/your_cmd.service
The content of this file must look like this:
# this is /usr/lib/systemd/system/your_cmd.service [Unit] Description=your_cmd server daemon Documentation=http://tuxgraphics.org/npa/ After=network.target syslog.target [Service] # see man systemd.service Type=oneshot ExecStart=/usr/bin/your_cmd-start.sh RemainAfterExit=true ExecStop=/usr/bin/your_cmd-stop.sh StandardOutput=journal [Install] WantedBy=multi-user.target

You can syntax check it with:
systemd-analyze verify /usr/lib/systemd/system/your_cmd.service

There are two important keywords in the unit file: Type=oneshot means that this is a script which just runs and then exits and RemainAfterExit=true means that although the script has finished the service is still running.

Now enable it:
systemctl list-unit-files | grep your_cmd systemctl enable your_cmd systemctl start your_cmd systemctl status your_cmd

To stop it:
systemctl list-units | grep your_cmd systemctl stop your_cmd

Case 2: You want to do some configuration tasks and execute those commands at startup.

This is very similar to the first case but there is no server process. You want to change some settings before a given service starts. In this example we want to run a script before httpd starts.
#!/bin/bash # This is /usr/bin/your_config-start.sh # # do all your commands here... script terminates when all is done.

You would write the following unit file and activate that service in the same way as in the above case. There is just no stop command.
# this is /usr/lib/systemd/system/your_config.service # enable with command: systemctl enable your_config [Unit] # man systemd.unit Description=your_config Documentation=http://tuxgraphics.org/npa/ After=network.target syslog.target Before=httpd.service Wants=httpd.service [Service] # see man systemd.service, systemd.exec Type=oneshot ExecStart=/usr/bin/your_config-start.sh StandardOutput=syslog StandardError=syslog [Install] WantedBy=multi-user.target

I hated systemd for a few days but after I figured out how to use it and how to add my own customizations it was not too bad. It works actually quite well. You just have to learn how to use it.

Back to: "No preservatives added"

Copyright © 2004-2018 Guido Socher