167

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?

4 Answers 4

173

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
3
  • 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
  • You can also use -p instead of -P if you prefer to see FragmentPath= before the response. Nov 9, 2023 at 12:28
35

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
1

This below one gives multiple file locations

show -- Show properties of one or more units/jobs or the manager

-p --property=NAME Show only properties by this name

$ systemctl show -p FragmentPath {accounts-daemon,ntp,sshd}
FragmentPath=/lib/systemd/system/accounts-daemon.service
FragmentPath=/lib/systemd/system/ntp.service
FragmentPath=/lib/systemd/system/ssh.service
1
  • Note that systemctl show -p FragmentPath {accounts-daemon,ntp,sshd} becomes systemctl show -p FragmentPath accounts-daemon ntp sshd after the shell performs brace expansion. Mar 6 at 18:42
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, 2023 at 10:04
  • 1
    @JoachimBreitner - well, I learned something today. Thanks! Mar 3, 2023 at 14:46

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .