Encontre a localização de um serviço de arquivo de unidade systemd

Encontre a localização de um serviço de arquivo de unidade systemd

Existem muitos locais diferentes onde os arquivos da unidade do systemd podem ser colocados. Existe uma maneira rápida e fácil de perguntar ao systemd de onde ele leu a declaração de um serviço, considerando apenas o nome do serviço?

Responder1

Para unidades definidas em arquivos estáticos reais, isso pode ser visto em 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)

Mas existem unidades que não são definidas por arquivos, por exemplo, com systemd-croninstaladas. Eles não têm localização útil listada com 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

Em ambos os casos, porém, o FragmentPathcampo está educando:

$ 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

Responder2

Você poderia cat a unidade systemd. Isso mostra a localização do arquivo como comentários. Bônus: também mostra substituições.

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

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

Responder3

Este abaixo fornece vários locais de arquivo

show -- Mostrar propriedades de uma ou mais unidades/trabalhos ou do gerente

-p --property=NAME Mostrar apenas propriedades com este nome

$ 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

Responder4

Você poderia fazer isso (usando nullmailer como exemplo):

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

Isso produzirá algo assim:

/lib/systemd/system/nullmailer.service

Então, para ver o conteúdo do arquivo de serviço, você poderia fazer o seguinte:

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

E isso produziria algo assim:

[Unit]
Description=nullmailer


[Unit]
Description=Nullmailer relay-only MTA

... stuff omitted for brevity ...

[Install]
WantedBy=multi-user.target

Espero que ajude.

PS. Normalmente coloco esses comandos em um arquivo de alias apenas por conveniência.

P.PS. Como Joaquin mencionou, você pode usar o sinalizador -P em vez de usar o combo grep|awk que eu estava usando/mencionando.

systemctl show nullmailer -P FragmentPath

informação relacionada