0 4 * * * /usr/sbin/reboot
Adjust interval as needed.
Or if you want something a bit faster and less disruptive:
#!/bin/sh
NAME="$0"
logger_cmd () {
echo $@
logger -p daemon.info -t "$NAME[$$]" $@
}
if ! which ncat 1>/dev/null
then
logger_cmd "ncat not found, installing..."
opkg update && opkg install ncat
fi
chk_conn () {
echo "Checking connectivity to $@"
if ncat --send-only --recv-only -w 334ms $@ 2>/dev/null; then
return 0
fi
logger_cmd "Cannot reach $@"
return 1
}
restart_network_iface() {
# TODO: Don't restart every minute
COOLDOWN_LOCK=/tmp/internet-connectivity-watchcat.tmp
COOLDOWN_SECONDS=300
cooldown_time_end=$(cat $COOLDOWN_LOCK || echo 0)
time_now="$(cat /proc/uptime)"
time_now="${time_now%%.*}"
cooldown_time_left=$((cooldown_time_end - time_now))
if [ "$cooldown_time_left" -lt "1" ]
then
logger_cmd "Restarting network interface: \"$1\"."
ifdown "$1"
ifup "$1"
cooldown_time_end=$((time_now + COOLDOWN_SECONDS))
echo $cooldown_time_end > $COOLDOWN_LOCK
else
logger_cmd "Skipping interface \"$1\" restart due to cooldown. Cooldown left: $cooldown_time_left seconds"
fi
}
logger_cmd "Checking internet connectivity..."
if chk_conn google.com 443 \
|| chk_conn amazon.com 443 \
|| chk_conn facebook.com 443 \
|| chk_conn cloudflare.com 443 \
|| chk_conn telekom.de 443
then
logger_cmd "Connected to internet."
else
logger_cmd "Not connected to internet."
restart_network_iface "$1"
fi
In restart_network_iface
use /usr/sbin/reboot
instead of interface up/down and run the script every few minutes via cron or systemd timer. This was written for OpenWrt so if you use that you can use it as-is. For other systems you’d also have to adjust the logger_cmd
.
You can place that on another machine and send a signal to a smart plug instead if you’re worried of a locked up / frozen router. That said if your router freezes like that, you should probably change it and you should be able to run this script on it.
Those are rookie numbers!