191

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

195

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 
5
  • How about the path of some mask service? (not all of them are in /lib/systemd/system or /usr/lib/systemd/system) Commented 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 Commented Mar 31, 2022 at 19:09
  • 1
    You can also use -p instead of -P if you prefer to see FragmentPath= before the response. Commented Nov 9, 2023 at 12:28
  • This answer is good. But got generated services - not that useful. I want to see how a service was generated. Is this possible? Presently I only see Loaded: loaded (/etc/containers/systemd/users/1002/pgsql.container; generated). Ok I found. systemctl cat my.service or systemctl show my.service. Thanks to serverfault.com/q/1091541/70242 Commented Sep 6, 2024 at 13:23
  • I noticed you can also use a wild card, like this: systemctl show -P FragmentPath *.service --no-pager Commented Jan 6 at 10:43
48

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] ... 
2
  • 1
    Neat, especially with the override! As my other solution it does not work for stuff like net-devices-eth0.device. Commented Jun 15, 2022 at 18:40
  • Use a wildcard: systemctl cat *.service --no-pager Commented Jan 6 at 10:44
2

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? Commented Mar 3, 2023 at 10:04
  • 1
    @JoachimBreitner - well, I learned something today. Thanks! Commented Mar 3, 2023 at 14:46
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. Commented Mar 6, 2024 at 18:42

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.