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".
- 218 megtekintés
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ó?
- A hozzászóláshoz be kell jelentkezni
Nem, olyat nem találtam. Nincs őrülten kicsinosítva.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Ha olyan disztrót használsz amiben van NetworkManager akkor használhatod a dispatcher funkcióját.
https://developer-old.gnome.org/NetworkManager/stable/NetworkManager.ht…
Anno a laptopomra volt belőve ha az otthoni hálózatra csatlakoztam (wifi/vezetékes) akkor autmatikusan csatlakoztatott egy NAS samba megosztást és vica versa.
Ha kell akkor előkeresem a példa scriptet.
- A hozzászóláshoz be kell jelentkezni
Hmm, ez még jó lehet B tervnek, köszi!
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni