Posts Getting systemd unit dependencies
Post
Cancel

Getting systemd unit dependencies

One of the difficult things of any init system is understanding how everything is all connected… what runs and when. One of the great things about systemd is that it makes it a fairly straightforward task to discover the dependency relationships for systemd units.

The main subcommand that will be used with systemctl for this is list-dependencies. During those times of wondering why this unit was started (or not started), this command will give you some clarity. Let’s see an example.

Here are two systemd units of type service for a small demo.

hello1.service

1
2
3
4
5
6
7
8
[Unit]
Description=Test hello service 1

[Service]
ExecStart=/usr/bin/echo hello from 1

[Install]
WantedBy=multi-user.target

hello2.service

1
2
3
4
5
6
7
8
9
[Unit]
Description=Test hello service 2
Requires=hello1.service

[Service]
ExecStart=/usr/bin/echo hello from 2

[Install]
WantedBy=multi-user.target

The directive that indicates the relationship between these two units is Requires in hello2.service. This marks hello1.service as its dependency. This is a common pattern that you will see if you start digging through the units on your systemd machine. Another thing to note here is that in the [Install] section that we have a WantedBy directive with multi-user.target. This is another indicator of a dependency relationship, this time we are saying that both of these services are wanted by multi-user.target.

What does it look like to list out the dependencies?

1
2
3
4
5
6
7
8
9
10
$ systemctl list-dependencies hello2.service
hello2.service
● ├─hello1.service
● ├─system.slice
● └─sysinit.target
●   ├─apparmor.service
●   ├─dev-hugepages.mount
●   ├─dev-mqueue.mount
●   ├─keyboard-setup.service
... output omitted for brevity ...

Notice above that hello1.service is listed as a depedency of hello2.service. This is expected because of the Requires directive. Another common requirement is to go the other way: Find out which units have a particular unit as a dependency. We can get this information by adding the --reverse switch.

1
2
3
4
5
$ systemctl list-dependencies --reverse hello1.service
hello1.service
● ├─hello2.service
● └─multi-user.target
●   └─graphical.target

In this case we listed all of the units that have hello1.service as a dependency. This tells us what we already knew above, that hello2.service has it as a dependency.

Getting comfortable with quick and dynamic discovery of how systemd units work together is a key skill in developing and troubleshooting units.

Enjoy!

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