Über eine neue Unit, die ich ebenso wie das Programm dazu 'network_wait_online' genannt habe. Es passiert nix anderes, als das durch das Statement 'Before=network-online.target' das reguläre network-online.target erst dann angezogen wird, wenn das Netz tatsächlich erfolgreich verbunden ist. Das heisst, alle anderen Service-Units, die auch after network-online.target verwenden, finden damit ebenfalls das erfolgreich verbundene Netzwerk vor. Gleichzeitig sollte damit verhindert sein, dass die aktive (!) Unit network-online.target gleich mehrere Wait-State-Instanzen etabliert, welche jeweils "substantial delays" beinhalten, wenn sie mehrfach angezogen wird. Das warten ist nicht eine statische Zeit lang, sondern tatsächlich nur so lange, bis der Server/Host wirklich erreichbar ist.scientific hat geschrieben:Wie löst du das mit der Unit, die anzeigt, ob ein Server erreichbar ist?
Zurrst das Programm anlegen:
Code: Alles auswählen
nano /usr/local/bin/network_wait_online
Code: Alles auswählen
#!/bin/bash
[ -z "$1" ] && Server="8.8.8.8" || Server=$1
sec=0
HomeNetIsConnect=-1
while [ true ]; do
/bin/ping -c1 -W1 -q $Server &>/dev/null
HomeNetIsConnect=$?
[ $sec -eq 90 ] || [ $HomeNetIsConnect -eq 0 ] && break
sec=$[$sec+1]
/bin/sleep 0.5
done
if [[ $HomeNetIsConnect -eq 0 ]]; then
echo "Host $Server is reachable! (RC:$HomeNetIsConnect, after $sec Seconds wait)" | systemd-cat -t "`basename $0`" -p "info"
exit 0
fi
echo "Host $Server is not reachable! (RC:$HomeNetIsConnect, after $sec Seconds wait)" | systemd-cat -t "`basename $0`" -p "err"
exit 1
Code: Alles auswählen
nano /etc/systemd/system/network_wait_online.service
Code: Alles auswählen
[Unit]
Description=network_wait_online.service: Waiting for Network or Server to be up
DefaultDependencies=no
After=network.target
Before=network-online.target
[Service]
Type=oneshot
TimeoutStartSec=95
ExecStart=/usr/local/bin/network_wait_online 10.20.30.1
[Install]
WantedBy=multi-user.target
Code: Alles auswählen
systemctl daemon-reload
systemctl enable network_wait_online.service
systemctl start network_wait_online.service
systemctl status network_wait_online.service
Code: Alles auswählen
Requires=network-online.target
After=network-online.target
Code: Alles auswählen
Requires=network_wait_online.service
After=network_wait_online.service
Code: Alles auswählen
x-systemd.requires==network_wait_online.service