152

There are many different places where systemd unit files may be placed. Is there a quick and easy way to ask systemd where it read a service’s declaration from, given just the service name?

3 Answers 3

158

For units that are defined in actual, static files, this can be seen in systemctl status:

$ systemctl status halt-local.service
● halt-local.service - /usr/sbin/halt.local Compatibility
   Loaded: loaded (/lib/systemd/system/halt-local.service; static)
   Active: inactive (dead)

But there are units that are not defined by files, e.g. with systemd-cron installed. These have no useful location listed with status:

$ systemctl status cron-jojo-0.timer
● cron-jojo-0.timer - [Cron] "*/10 * * * * ..."
   Loaded: loaded (/var/spool/cron/crontabs/jojo)
   Active: active (waiting) since Mon 2015-05-18 14:53:01 UTC; 9min ago

In either case, though, the FragmentPath field is educating:

$ systemctl show -P FragmentPath cron-daily.service
/lib/systemd/system/cron-daily.service
$ systemctl show -P FragmentPath cron-jojo-0.service
/run/systemd/generator/cron-jojo-0.service
$ systemctl show -P FragmentPath halt-local.service
/lib/systemd/system/halt-local.service
2
  • How about the path of some mask service? (not all of them are in /lib/systemd/system or /usr/lib/systemd/system)
    – desgua
    Oct 31, 2020 at 15:28
  • Good, but partial, answer. But FragmentPath can be empty, e.g: systemctl show -p FragmentPath subsystem-net-devices-eth0.device
    – BobHy
    Mar 31, 2022 at 19:09
19

You could cat the systemd unit. This shows the file location as comments. Bonus: It also shows overrides.

systemctl cat sssd
# /lib/systemd/system/sssd.service
[Unit]
...

# /etc/systemd/system/sssd.service.d/override.conf
[Unit]
...
1
  • 1
    Neat, especially with the override! As my other solution it does not work for stuff like net-devices-eth0.device. Jun 15, 2022 at 18:40
0

You could do this (using nullmailer as an example):

systemctl show nullmailer | grep FragmentPath | awk -F'=' '{print $2}'

That will produce something like this:

/lib/systemd/system/nullmailer.service

Then to see the service file content, you could do this:

cat $(systemctl show nullmailer | grep FragmentPath | awk -F'=' '{print $2}')

And that would produce something like this:

[Unit]
Description=nullmailer


[Unit]
Description=Nullmailer relay-only MTA

... stuff omitted for brevity ...

[Install]
WantedBy=multi-user.target

Hope it helps.

PS. I typically put those commands in an alias file just for convenience.

P.PS. As Joaquin mentioned, you can use the -P flag instead of using the grep|awk combo I was using/mentioning.

systemctl show nullmailer -P FragmentPath
2
  • 1
    Why do you use grep and awk when systemctl supports -P to print just one field? Mar 3 at 10:04
  • 1
    @JoachimBreitner - well, I learned something today. Thanks! Mar 3 at 14:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.