Primeiro de tudo:
O que você descreve como sua resposta desejada é o que você realmente chama: Eu também não quero criar um script que faça pesquisas constantes . Inotify também é usado em um loop constante para "ouvir" as mudanças no estado atual. Em outras palavras: a outra opção que você supõe existir não existe sem algum tipo de loop.
Eu também acho que sua imagem de um loop é muito pesada. Em todos os sistemas, em cada aplicativo existem vários loops ativos para aguardar gatilhos. Não deve ter nenhum efeito perceptível em seus recursos.
A "anatomia" de um mecanismo take-action-on-event é basicamente:
em um loop while:
check the current status;
if a is True:
take action A
if a is False:
do nothing
wait a few seconds
Em um script bash
Integrar este script (para verificar sua conexão) em um loop while (com algumas pequenas alterações) deve fazer o que você descreve: restabeleça sua conexão e envie uma notificação.
#!/bin/bash
while :
do
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
:
else
rfkill block wifi
rfkill unblock wifi
notify-send "connection re-established"
fi
sleep 4
done
Em um script python
A função check()
retorna True ou False . Se Verdadeiro (conexão estiver ativa), nada acontece. Se False , seu rfkill block wifi
/ rfkill ublock wifi
é executado.
#!/usr/bin/env python3
import socket
import time
import subprocess
def check():
try:
host = socket.gethostbyname("www.google.com")
s = socket.create_connection((host, 80), 2)
return True
except Exception:
return False
while True:
if check() == True:
pass
else:
subprocess.call(["/bin/bash", "-c", "rfkill", "block", "wifi"])
subprocess.call(["/bin/bash", "-c", "rfkill", "unblock", "wifi"])
subprocess.Popen(["/bin/bash", "-c", "notify-send 'conncection re-established'"])
time.sleep(4)