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
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
- 4,399
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
- 519
- 3
- 6
This below one gives multiple file locations
show-- Show properties of one or more units/jobs or the manager
-p--property=NAMEShow 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