GNU/Linux >> Znalost Linux >  >> Linux

Zajistěte, aby uživatelská služba systemd závisela na systémovém cíli

Měl jsem stejný problém se skriptem zálohování uživatelské země, který potřebuje přístup k internetu. Vyřešil jsem to přidáním ~/.config/systemd/user/wait-for-network.service to jen pingne google.com dokud nebude dosažitelná:

[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

Pak jsem na tom nechal záviset můj záložní skript takto:

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

Funguje to bez ohledu na to, zda používáte NetworkManager nebo nějaký jiný způsob navázání spojení.


Zapomeňte na network.target . man systemd.special říká:

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.

Takže tento cíl je primárně hack na kompatibilitu pro SysV init skripty.

Za předpokladu, že vaše síťové připojení zpracovává NetworkManager, měli jste samozřejmě právo spoléhat se na tento cíl, protože NetworkManager.service definuje Before=network.target . To však znamená pouze to, že byl spuštěn NetworkManager, nikoli to, že je skutečně navázáno síťové připojení. To může chvíli trvat (dhcp zpáteční cesty, wifi handshake atd.) a je to výhradně záležitostí NetworkManageru. Alespoň na mém systému (F18) existuje služba s názvem NetworkManager-wait-online . Používá nm-online obslužný program zablokovat, dokud nebude navázáno aktivní připojení. Zkuste Require, Before v definici jednotky nebo použijte tento nástroj samostatně.


Linux
  1. Jak vytvořit službu Systemd v Linuxu

  2. Jak změnit uživatele pro spoustu souborů služby Systemd?

  3. Jak zastavit službu systemd

  1. Jak spustit skript s systemd těsně před vypnutím?

  2. pomocí časovačů systemd místo cronu

  3. Systém odmítá SSH a po instalaci systemd se zasekl při 'bootování'

  1. Přidání nové služby do Linux systemd

  2. Proč většina příkladů Systemd obsahuje Wantedby=multi-user.target?

  3. systemd:Udělte neprivilegovanému uživateli oprávnění ke změně jedné konkrétní služby