Suchen Sie den Speicherort eines Systemd-Unit-Dateidienstes

Suchen Sie den Speicherort eines Systemd-Unit-Dateidienstes

Es gibt viele verschiedene Orte, an denen Systemd-Unit-Dateien abgelegt werden können. Gibt es eine schnelle und einfache Möglichkeit, Systemd zu fragen, woher es die Deklaration eines Dienstes gelesen hat, indem nur der Dienstname angegeben wird?

Antwort1

Für Einheiten, die in tatsächlichen, statischen Dateien definiert sind, ist dies wie folgt zu sehen 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)

Es gibt jedoch Einheiten, die nicht durch Dateien definiert sind, z. B. mit systemd-croninstalliert. Diese haben keinen sinnvollen Speicherort, der mit aufgeführt ist 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 beiden Fällen hat das Fachgebiet jedoch einen FragmentPathaufklärenden Charakter:

$ 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

Antwort2

Sie könnten die systemd-Einheit caten. Dies zeigt den Dateispeicherort als Kommentare an. Bonus: Es zeigt auch Overrides an.

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

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

Antwort3

Das Folgende gibt mehrere Dateispeicherorte an

show -- Eigenschaften einer oder mehrerer Einheiten/Jobs oder des Managers anzeigen

-p --property=NAME Nur Unterkünfte mit diesem Namen anzeigen

$ 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

Antwort4

Sie könnten Folgendes tun (am Beispiel von Nullmailer):

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

Das Ergebnis wird ungefähr wie folgt aussehen:

/lib/systemd/system/nullmailer.service

Um den Inhalt der Servicedatei anzuzeigen, können Sie Folgendes tun:

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

Und das Ergebnis wäre etwa wie folgt:

[Unit]
Description=nullmailer


[Unit]
Description=Nullmailer relay-only MTA

... stuff omitted for brevity ...

[Install]
WantedBy=multi-user.target

Ich hoffe es hilft.

PS: Normalerweise füge ich diese Befehle der Einfachheit halber in einer Aliasdatei ein.

P.PS. Wie Joaquin erwähnt hat, können Sie das Flag -P anstelle der von mir verwendeten/erwähnten Kombination grep|awk verwenden.

systemctl show nullmailer -P FragmentPath

verwandte Informationen