GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Systemd-Benutzerdienst vom Systemziel abhängig machen

Ich hatte das gleiche Problem mit einem Userland-Backup-Skript, das Zugriff auf das Internet benötigt. Ich habe es gelöst, indem ich ~/.config/systemd/user/wait-for-network.service hinzugefügt habe das pingt nur google.com bis es erreichbar ist:

[Unit]
Description=Ping a server on the internet until it becomes reachable

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'while ! ping -c1 google.com; do sleep 1; done'
TimeoutStartSec=60s

Dann habe ich mein Backup-Skript wie folgt davon abhängig gemacht:

[Unit]
Description=...
Requires=wait-for-network.service
After=wait-for-network.service

Dies funktioniert unabhängig davon, ob Sie NetworkManager verwenden oder ein anderes Mittel, um die Verbindung herzustellen.


Vergessen Sie die network.target . man systemd.special sagt:

network.target
       systemd automatically adds dependencies of type After for
       this target unit to all SysV init script service units
       with an LSB header referring to the $network facility.

Dieses Ziel ist also in erster Linie ein Kompatibilitäts-Hack für SysV-Init-Skripte.

Unter der Annahme, dass Ihre Netzwerkverbindung von NetworkManager verwaltet wird, haben Sie sich natürlich zu Recht auf dieses Ziel verlassen, da NetworkManager.service definiert Before=network.target . Dies bedeutet jedoch nur, dass der NetworkManager gestartet wurde, nicht dass die Netzwerkverbindung tatsächlich hergestellt wurde. Das kann eine Weile dauern (DHCP-Roundtrips, WLAN-Handshake usw.) und ist ausschließlich Sache von NetworkManager. Zumindest auf meinem System (F18) gibt es einen Dienst namens NetworkManager-wait-online . Es verwendet den nm-online Dienstprogramm zu blockieren, bis eine aktive Verbindung hergestellt ist. Versuchen Sie es mit Require, Before das in Ihrer Unit-Definition oder verwenden Sie dieses Tool allein.


Linux
  1. Hinzufügen eines neuen Dienstes zu Linux systemd

  2. Wie ändere ich den Benutzer für eine Reihe von Systemd-Dienstdateien?

  3. Linux-Betriebssystemdienst „winbind“

  4. Wie stoppen Sie den systemd-Dienst

  5. systemd - Gibt meinem Dienst mehrere Argumente

Systemctl-Befehle zum Verwalten des Systemd-Dienstes

Verwalten von cgroups mit systemd

SystemD - Wofür wird SystemD verwendet?

So machen Sie einen Benutzer zum Administrator in Debian 11

Wie führe ich ein Skript mit systemd kurz vor dem Herunterfahren aus?

Systemd-Socket-Aktivierung vs. xinetd