Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

Perangkat headless — STB Armbian, Raspberry Pi, atau server mini sejenisnya — rentan terhadap satu masalah yang tidak bisa ditangani secara manual: koneksi internet putus tanpa recovery otomatis. Ketika router mengalami hang atau DHCP lease bermasalah, perangkat bisa terjebak dalam kondisi offline berjam-jam sampai ada yang menyadarinya dan melakukan reboot secara manual.
Artikel ini membahas cara membangun sistem netwatch sederhana menggunakan Bash dan cron: sebuah script yang memantau koneksi ke router secara berkala, mencatat kegagalan, dan melakukan reboot secara aman jika koneksi benar-benar terputus total selama satu jam penuh — bukan sekadar gangguan sesaat.
rootping dan cron tersedia (keduanya ada secara default di hampir semua distro)Sebelum membuat file apapun, penting untuk memahami logika di balik script ini — terutama bagian toleransi kegagalan, karena inilah yang membedakannya dari netwatch naif yang langsung reboot saat ping pertama gagal.
Setiap kali script berjalan, dikirimkan 3 paket ICMP ke IP router dengan batas tunggu 3 detik per paket. Sesuai perilaku ping di Linux, jika minimal satu paket mendapat balasan, exit code-nya 0 (sukses). Ketiga paket harus gagal semua baru dianggap kegagalan.
Script tidak langsung reboot saat satu tes gagal. Setiap kegagalan dicatat sebagai hitungan di file /tmp/netwatch_fails. Script dijadwalkan berjalan setiap 10 menit, sehingga diperlukan 6 kegagalan berturut-turut untuk memenuhi toleransi 60 menit sebelum reboot dieksekusi.
Jika router sempat membalas di tengah periode pemantauan — bahkan hanya sekali di menit ke-40 — counter otomatis di-reset ke nol. Ini mencegah false positive akibat gangguan sesaat.
Counter disimpan di /tmp yang berbasis RAM, bukan di eMMC atau SD card, untuk menghindari write cycle yang tidak perlu pada media penyimpanan.
Reboot menggunakan /bin/systemctl reboot dengan jalur absolut — diperlukan karena cron berjalan dengan environment yang terbatas dan tidak selalu menemukan binary di PATH yang biasa. Penggunaan systemctl reboot juga memastikan semua service dimatikan secara terstruktur sebelum sistem restart, berbeda dari reboot bare yang bisa memotong proses yang sedang berjalan.
nano /usr/local/bin/check-netwatch.sh
Paste seluruh isi berikut:
#!/bin/bash
# ==========================================
# Konfigurasi
# ==========================================
TARGET_IP="192.168.1.1" # Sesuaikan dengan IP gateway/router
FAIL_FILE="/tmp/netwatch_fails"
MAX_FAILS=6 # 6 kegagalan x interval 10 menit = 1 jam
# ==========================================
# Tes Koneksi
# ==========================================
if ping -c 3 -W 3 "$TARGET_IP" > /dev/null 2>&1; then
[ -f "$FAIL_FILE" ] && rm -f "$FAIL_FILE"
exit 0
fi
# ==========================================
# Penanganan Kegagalan
# ==========================================
COUNT=1
if [ -f "$FAIL_FILE" ]; then
OLD_COUNT=$(cat "$FAIL_FILE")
if [[ "$OLD_COUNT" =~ ^[0-9]+$ ]]; then
COUNT=$((OLD_COUNT + 1))
fi
fi
echo "$COUNT" > "$FAIL_FILE"
if [ "$COUNT" -lt "$MAX_FAILS" ]; then
exit 0
fi
# ==========================================
# Eksekusi Reboot
# ==========================================
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Jaringan tidak merespons selama 1 jam. Me-reboot sistem..." >> /var/log/netwatch.log
rm -f "$FAIL_FILE"
/bin/systemctl reboot
Sesuaikan nilai TARGET_IP dengan IP gateway yang digunakan. Pada kebanyakan jaringan rumahan, nilainya 192.168.1.1 atau 192.168.0.1 — verifikasi dengan ip route | grep default.
Jadikan script executable:
chmod +x /usr/local/bin/check-netwatch.sh
Perintah berikut menambahkan jadwal ke crontab root dengan pelindung duplikasi — aman dijalankan lebih dari sekali:
(crontab -l 2>/dev/null | grep -Fv "/usr/local/bin/check-netwatch.sh"; echo "*/10 * * * * /usr/local/bin/check-netwatch.sh") | crontab -
Verifikasi jadwal tersimpan dengan benar:
crontab -l
Output harus memuat tepat satu baris berikut:
*/10 * * * * /usr/local/bin/check-netwatch.sh
Jalankan script secara langsung untuk memastikan tidak ada error sintaks:
/usr/local/bin/check-netwatch.sh
Jika router aktif, script selesai dalam 1–3 detik tanpa output apapun. Ini perilaku yang benar — script hanya menulis ke log saat ada kegagalan atau saat reboot dieksekusi.
cat /tmp/netwatch_fails
Interpretasi:
| Kondisi | Keterangan |
|---|---|
| File tidak ditemukan | Jaringan normal, ping terakhir sukses |
Berisi angka 1–5 | Ada gangguan sementara, belum mencapai ambang reboot |
| File tidak ada lagi setelah reboot | Counter dibersihkan sebelum reboot — normal |
cat /var/log/netwatch.log
Setiap entri log menandakan satu kejadian reboot otomatis beserta timestamp-nya.
| Parameter | Nilai Default | Keterangan |
|---|---|---|
TARGET_IP | 192.168.1.1 | IP router/gateway yang dipantau |
-c 3 | 3 paket | Jumlah paket ping per pengujian |
-W 3 | 3 detik | Timeout per paket |
MAX_FAILS | 6 | Kegagalan berturut-turut sebelum reboot (6 × 10 menit = 60 menit) |
| Interval cron | */10 * * * * | Script berjalan setiap 10 menit |
Mengubah toleransi waktu — untuk toleransi 30 menit, ubah MAX_FAILS menjadi 3. Untuk 2 jam, ubah menjadi 12. Interval cron tidak perlu diubah.
Memantau host selain router — ganti TARGET_IP dengan IP atau domain lain, misalnya 8.8.8.8 untuk memantau konektivitas ke internet secara langsung. Perlu dipertimbangkan bahwa ping ke IP publik bisa gagal karena alasan di luar kendali perangkat (ISP down, firewall) sehingga false positive lebih mungkin terjadi dibanding memantau router lokal.
Menonaktifkan sementara — cukup hapus baris dari crontab:
crontab -l | grep -Fv "/usr/local/bin/check-netwatch.sh" | crontab -
# Buat script
nano /usr/local/bin/check-netwatch.sh
chmod +x /usr/local/bin/check-netwatch.sh
# Jadwalkan via cron
(crontab -l 2>/dev/null | grep -Fv "/usr/local/bin/check-netwatch.sh"; echo "*/10 * * * * /usr/local/bin/check-netwatch.sh") | crontab -
# Verifikasi
crontab -l
# Uji manual
/usr/local/bin/check-netwatch.sh
# Monitoring
cat /tmp/netwatch_fails
cat /var/log/netwatch.log
Artikel ini disusun berdasarkan pengujian langsung pada lingkungan berikut:
Solusi ini bersifat ringan dan tidak memerlukan dependensi tambahan di luar paket standar yang sudah tersedia pada hampir semua instalasi Linux.