查找 systemd 单元文件服务的位置

查找 systemd 单元文件服务的位置

systemd 单元文件可以放在许多不同的地方。有没有一种快速简便的方法可以询问 systemd 它从哪里读取服务的声明(仅提供服务名称)?

答案1

对于在实际静态文件中定义的单元,可以在以下位置看到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)

但有些单元没有通过文件定义,例如systemd-cron已安装的单元。这些单元没有列出有用的位置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

但无论哪种情况,该FragmentPath领域都在教育:

$ 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

您可以 cat systemd 单元。这会将文件位置显示为注释。额外好处:它还会显示覆盖。

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

# /etc/systemd/system/sssd.service.d/override.conf
[Unit]
...

答案3

下面给出了多个文件位置

show -- 显示一个或多个单位/作业或经理的属性

-p --property=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

答案4

您可以这样做(使用 nullmailer 作为示例):

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

这将产生如下结果:

/lib/systemd/system/nullmailer.service

然后要查看服务文件内容,您可以执行以下操作:

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

这将产生如下结果:

[Unit]
Description=nullmailer


[Unit]
Description=Nullmailer relay-only MTA

... stuff omitted for brevity ...

[Install]
WantedBy=multi-user.target

希望能帮助到你。

PS. 为了方便起见,我通常将这些命令放在别名文件中。

P.PS. 正如 Joaquin 提到的,您可以使用 -P 标志,而不是使用我正在使用/提及的 grep|awk 组合。

systemctl show nullmailer -P FragmentPath

相关内容