systemd service leállítása ha nincs hálózat (wifi) - SteamOS/Arch

Van egy systemd service (resilio sync), amit nem szeretnék futva hagyni, ha nincs hálózat. Azaz ideális esetben ha leállítom a wifit, akár úgy, hogy magát a wifit kapcsolom le, akár úgy, hogy repülőmódba váltok, akkor álljon le, illetve induljon el, ha ezeket visszakapcsolom.

Amit találtam:

BindsTO=sys-subsystem-net-devices-wlan0.device
Ez vicces, a wlan0 mindig aktív, még repülőmódban is, de ennek még lehet értelmes oka.

PropagatesStopTo= StopPropagatedFrom=

Nem találtam olyat, amire ráakaszthatnám (ezt kifelejtettem).

A systemctl --all egyezik, ha offline a masina, ha nem.

systemd-rfkill

Ez a service aktív, amikor le van lőve a wifi. Arra látok esélyt, hogy valahogy el lehet magyarázni a systemd-nek, hogy ennek pont az ellentettje kell, azaz ha ez fut, akkor a másik álljon, és vice versa. de nekem nem ment

Na, ezt benéztem, csak egy ideig aktív.

Conflicts=

Ez meg másra való.

systemctl list-units --type=socket

Nem találtam hasznos socketet.

StopCondition

Na, ilyen nincs. ExecCondition van, de stopra nincs ilyen.

dbus

Gondoltam hogy valami dbus eventre lehetne figyelni, de nem találtam erre megoldást.

Fontos, hogy a gyári service-ket nem akarom módosítani (sőt, a resilio sync eleinte user unitként futott, de ha jól értem, akkor végképp esélytelen, hogy a system unitokra dependáljon).

Illetve ideális esetben a hálózat levágása illedelmesen megvárná előbb hogy a resilio sync megáll (pár másodperc).

Amit nem szeretnék, az a taknyolás, pl. hogy crontabból pingetni, és stop-start. Ha már a systemd annyira csodálatos, akkor azzal szeretnén megoldani, és nem az elavult (lol) módszerekkel.

Ha valakinek van jó ötlete, ne tartsa magában, de ha lehet, akkor ne a google első találata legyen, hogy "eztpóbáldki".

Hozzászólások

Pedig ez elég bindstonak hangzik, nincs ott egy olyan service, ami tényleg akkor fut, ha megy vmelyik netwok? Esetleg valamelyik Propagate kezdetű kulcsszó? 

Fcksystemd!

Kipróbáltam a Void-ot, a runit tisztább-szárazabb érzés.

Most még megnézem a GuixSD-n a sheperd-et.

Egyrészt man systemd. A PropagatesStopTo=, StopPropagatedFrom= lenne ami jó lenne, ha lenne valami, amire rá tudnám akasztani.

Másrészt:

$ ping -c 3 hup.hu ; systemctl --type=target --all| grep network
PING hup.hu (92.119.122.43) 56(84) bytes of data.
64 bytes from hup.rackforest.hu (92.119.122.43): icmp_seq=1 ttl=55 time=103 ms
64 bytes from hup.rackforest.hu (92.119.122.43): icmp_seq=2 ttl=55 time=124 ms
64 bytes from hup.rackforest.hu (92.119.122.43): icmp_seq=3 ttl=55 time=147 ms

--- hup.hu ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 102.535/124.568/146.732/18.043 ms
  network-online.target                               loaded inactive dead   Network is Online
  network-pre.target                                  loaded inactive dead   Preparation for Network
  network.target                                      loaded active   active Network

És nem, a network target sem jó, lásd manpage.

Gyorsan összedobta egy scriptet, nekem működött, "debug" módban, a hálózati interface nevére ügyelj.

Ebbe a mappába másolhatod -> /etc/NetworkManager/dispatcher.d a NetworkManager sorrendben olvassa be az itt található fájlokat, szóval én például 99-resilio-sync-nek nevezném el.

#!/usr/bin/env bash

INTERFACE=$1
STATE=$2
INTERFACE_DESIRED="wlan0"

function debug ()
{
   printf "%s $(date) --- ${INTERFACE} --- ${STATE}" > /tmp/NetworkManagerDispatcher.log
}

if [ "${INTERFACE}" == "${INTERFACE_DESIRED}" ]; then

   case "${STATE}" in
      "up")
          #debug
          systemctl start resilio-sync
          ;;
       "pre-down")
           #debug
           systemctl stop resilio-sync
           ;;
       *)
           exit 1
           ;;
    esac
fi

Köszi :)

Apróbb változtatások:

#!/usr/bin/env bash

INTERFACE=$1
STATE=$2
INTERFACE_DESIRED="wlan0"

debug()
 {
   printf "%s $(date) --- ${INTERFACE} --- ${STATE} \\n" >> /tmp/NetworkManagerDispatcher.log
 }

if [ "${INTERFACE}" == "${INTERFACE_DESIRED}" ]; then

   case "${STATE}" in
      "up")
          debug
          systemctl start resiliosync
          ;;
       "down")
           debug
           systemctl stop resiliosync
           ;;
       *)
           debug
           exit 1
           ;;
    esac
fi