{"id":3444,"date":"2026-10-26T14:43:05","date_gmt":"2026-10-26T14:43:05","guid":{"rendered":"https:\/\/rri.my.id\/?p=3444"},"modified":"2026-10-26T14:43:38","modified_gmt":"2026-10-26T14:43:38","slug":"netwatch-auto-reboot-armbian-linux","status":"publish","type":"post","link":"https:\/\/rri.my.id\/index.php\/2026\/10\/26\/netwatch-auto-reboot-armbian-linux\/","title":{"rendered":"Implementasi Netwatch Auto-Reboot di Linux Armbian"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Perangkat headless \u2014 STB Armbian, Raspberry Pi, atau server mini sejenisnya \u2014 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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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 \u2014 bukan sekadar gangguan sesaat.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Prasyarat<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Linux berbasis systemd (Armbian, Raspberry Pi OS, Debian, Ubuntu Server)<\/li>\n\n\n\n<li>Akses terminal sebagai <code>root<\/code><\/li>\n\n\n\n<li><code>ping<\/code> dan <code>cron<\/code> tersedia (keduanya ada secara default di hampir semua distro)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Cara Kerja<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sebelum membuat file apapun, penting untuk memahami logika di balik script ini \u2014 terutama bagian toleransi kegagalan, karena inilah yang membedakannya dari netwatch naif yang langsung reboot saat ping pertama gagal.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Uji Ping<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Setiap kali script berjalan, dikirimkan 3 paket ICMP ke IP router dengan batas tunggu 3 detik per paket. Sesuai perilaku <code>ping<\/code> di Linux, jika minimal satu paket mendapat balasan, exit code-nya <code>0<\/code> (sukses). Ketiga paket harus gagal semua baru dianggap kegagalan.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Counter Kegagalan dan Toleransi 1 Jam<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Script tidak langsung reboot saat satu tes gagal. Setiap kegagalan dicatat sebagai hitungan di file <code>\/tmp\/netwatch_fails<\/code>. Script dijadwalkan berjalan setiap 10 menit, sehingga diperlukan <strong>6 kegagalan berturut-turut<\/strong> untuk memenuhi toleransi 60 menit sebelum reboot dieksekusi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jika router sempat membalas di tengah periode pemantauan \u2014 bahkan hanya sekali di menit ke-40 \u2014 counter otomatis di-reset ke nol. Ini mencegah false positive akibat gangguan sesaat.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Counter disimpan di <code>\/tmp<\/code> yang berbasis RAM, bukan di eMMC atau SD card, untuk menghindari write cycle yang tidak perlu pada media penyimpanan.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Reboot Aman via systemd<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Reboot menggunakan <code>\/bin\/systemctl reboot<\/code> dengan jalur absolut \u2014 diperlukan karena cron berjalan dengan environment yang terbatas dan tidak selalu menemukan binary di <code>PATH<\/code> yang biasa. Penggunaan <code>systemctl reboot<\/code> juga memastikan semua service dimatikan secara terstruktur sebelum sistem restart, berbeda dari <code>reboot<\/code> bare yang bisa memotong proses yang sedang berjalan.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Langkah 1 \u2014 Buat Script Netwatch<\/h2>\n\n\n\n<pre class=\"wp-block-code has-palette-color-5-color has-palette-color-3-background-color has-text-color has-background has-link-color wp-elements-1\"><code>nano \/usr\/local\/bin\/check-netwatch.sh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Paste seluruh isi berikut:<\/p>\n\n\n\n<pre class=\"wp-block-code has-palette-color-5-color has-palette-color-3-background-color has-text-color has-background has-link-color wp-elements-2\"><code>#!\/bin\/bash\n\n# ==========================================\n# Konfigurasi\n# ==========================================\nTARGET_IP=\"<span style=\"color: #cf2e2e;\" class=\"stk-highlight\">192.168.1.1<\/span>\"       # Sesuaikan dengan IP gateway\/router\nFAIL_FILE=\"\/tmp\/netwatch_fails\"\nMAX_FAILS=6                   # 6 kegagalan x interval 10 menit = 1 jam\n\n# ==========================================\n# Tes Koneksi\n# ==========================================\nif ping -c 3 -W 3 \"$TARGET_IP\" > \/dev\/null 2>&amp;1; then\n    &#91; -f \"$FAIL_FILE\" ] &amp;&amp; rm -f \"$FAIL_FILE\"\n    exit 0\nfi\n\n# ==========================================\n# Penanganan Kegagalan\n# ==========================================\nCOUNT=1\nif &#91; -f \"$FAIL_FILE\" ]; then\n    OLD_COUNT=$(cat \"$FAIL_FILE\")\n    if &#91;&#91; \"$OLD_COUNT\" =~ ^&#91;0-9]+$ ]]; then\n        COUNT=$((OLD_COUNT + 1))\n    fi\nfi\necho \"$COUNT\" > \"$FAIL_FILE\"\n\nif &#91; \"$COUNT\" -lt \"$MAX_FAILS\" ]; then\n    exit 0\nfi\n\n# ==========================================\n# Eksekusi Reboot\n# ==========================================\necho \"&#91;$(date '+%Y-%m-%d %H:%M:%S')] Jaringan tidak merespons selama 1 jam. Me-reboot sistem...\" >> \/var\/log\/netwatch.log\n\nrm -f \"$FAIL_FILE\"\n\n\/bin\/systemctl reboot<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sesuaikan nilai <code>TARGET_IP<\/code> dengan IP gateway yang digunakan. Pada kebanyakan jaringan rumahan, nilainya <code>192.168.1.1<\/code> atau <code>192.168.0.1<\/code> \u2014 verifikasi dengan <code>ip route | grep default<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jadikan script executable:<\/p>\n\n\n\n<pre class=\"wp-block-code has-palette-color-5-color has-palette-color-3-background-color has-text-color has-background has-link-color wp-elements-3\"><code>chmod +x \/usr\/local\/bin\/check-netwatch.sh<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Langkah 2 \u2014 Jadwalkan dengan Crontab<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Perintah berikut menambahkan jadwal ke crontab root dengan pelindung duplikasi \u2014 aman dijalankan lebih dari sekali:<\/p>\n\n\n\n<pre class=\"wp-block-code has-palette-color-5-color has-palette-color-3-background-color has-text-color has-background has-link-color wp-elements-4\"><code>(crontab -l 2>\/dev\/null | grep -Fv \"\/usr\/local\/bin\/check-netwatch.sh\"; echo \"*\/10 * * * * \/usr\/local\/bin\/check-netwatch.sh\") | crontab -<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Verifikasi jadwal tersimpan dengan benar:<\/p>\n\n\n\n<pre class=\"wp-block-code has-palette-color-5-color has-palette-color-3-background-color has-text-color has-background has-link-color wp-elements-5\"><code>crontab -l<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output harus memuat tepat satu baris berikut:<\/p>\n\n\n\n<pre class=\"wp-block-code has-palette-color-5-color has-palette-color-3-background-color has-text-color has-background has-link-color wp-elements-6\"><code>*\/10 * * * * \/usr\/local\/bin\/check-netwatch.sh<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Langkah 3 \u2014 Uji Manual<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Jalankan script secara langsung untuk memastikan tidak ada error sintaks:<\/p>\n\n\n\n<pre class=\"wp-block-code has-palette-color-5-color has-palette-color-3-background-color has-text-color has-background has-link-color wp-elements-7\"><code>\/usr\/local\/bin\/check-netwatch.sh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Jika router aktif, script selesai dalam 1\u20133 detik tanpa output apapun. Ini perilaku yang benar \u2014 script hanya menulis ke log saat ada kegagalan atau saat reboot dieksekusi.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Monitoring<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Cek Status Counter<\/h3>\n\n\n\n<pre class=\"wp-block-code has-palette-color-5-color has-palette-color-3-background-color has-text-color has-background has-link-color wp-elements-8\"><code>cat \/tmp\/netwatch_fails<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Interpretasi:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kondisi<\/th><th>Keterangan<\/th><\/tr><\/thead><tbody><tr><td>File tidak ditemukan<\/td><td>Jaringan normal, ping terakhir sukses<\/td><\/tr><tr><td>Berisi angka <code>1<\/code>\u2013<code>5<\/code><\/td><td>Ada gangguan sementara, belum mencapai ambang reboot<\/td><\/tr><tr><td>File tidak ada lagi setelah reboot<\/td><td>Counter dibersihkan sebelum reboot \u2014 normal<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Cek Riwayat Auto-Reboot<\/h3>\n\n\n\n<pre class=\"wp-block-code has-palette-color-5-color has-palette-color-3-background-color has-text-color has-background has-link-color wp-elements-9\"><code>cat \/var\/log\/netwatch.log<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Setiap entri log menandakan satu kejadian reboot otomatis beserta timestamp-nya.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Ringkasan Parameter<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Parameter<\/th><th>Nilai Default<\/th><th>Keterangan<\/th><\/tr><\/thead><tbody><tr><td><code>TARGET_IP<\/code><\/td><td><code>192.168.1.1<\/code><\/td><td>IP router\/gateway yang dipantau<\/td><\/tr><tr><td><code>-c 3<\/code><\/td><td>3 paket<\/td><td>Jumlah paket ping per pengujian<\/td><\/tr><tr><td><code>-W 3<\/code><\/td><td>3 detik<\/td><td>Timeout per paket<\/td><\/tr><tr><td><code>MAX_FAILS<\/code><\/td><td><code>6<\/code><\/td><td>Kegagalan berturut-turut sebelum reboot (6 \u00d7 10 menit = 60 menit)<\/td><\/tr><tr><td>Interval cron<\/td><td><code>*\/10 * * * *<\/code><\/td><td>Script berjalan setiap 10 menit<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Penyesuaian Umum<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Mengubah toleransi waktu<\/strong> \u2014 untuk toleransi 30 menit, ubah <code>MAX_FAILS<\/code> menjadi <code>3<\/code>. Untuk 2 jam, ubah menjadi <code>12<\/code>. Interval cron tidak perlu diubah.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Memantau host selain router<\/strong> \u2014 ganti <code>TARGET_IP<\/code> dengan IP atau domain lain, misalnya <code>8.8.8.8<\/code> 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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Menonaktifkan sementara<\/strong> \u2014 cukup hapus baris dari crontab:<\/p>\n\n\n\n<pre class=\"wp-block-code has-palette-color-5-color has-palette-color-3-background-color has-text-color has-background has-link-color wp-elements-10\"><code>crontab -l | grep -Fv \"\/usr\/local\/bin\/check-netwatch.sh\" | crontab -<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Ringkasan Perintah<\/h2>\n\n\n\n<pre class=\"wp-block-code has-palette-color-5-color has-palette-color-3-background-color has-text-color has-background has-link-color wp-elements-11\"><code># Buat script\nnano \/usr\/local\/bin\/check-netwatch.sh\nchmod +x \/usr\/local\/bin\/check-netwatch.sh\n\n# Jadwalkan via cron\n(crontab -l 2>\/dev\/null | grep -Fv \"\/usr\/local\/bin\/check-netwatch.sh\"; echo \"*\/10 * * * * \/usr\/local\/bin\/check-netwatch.sh\") | crontab -\n\n# Verifikasi\ncrontab -l\n\n# Uji manual\n\/usr\/local\/bin\/check-netwatch.sh\n\n# Monitoring\ncat \/tmp\/netwatch_fails\ncat \/var\/log\/netwatch.log<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Referensi<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.gnu.org\/software\/bash\/manual\/bash.html#Bash-Conditional-Expressions\">Bash Reference Manual \u2014 Conditional Expressions<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/man7.org\/linux\/man-pages\/man5\/crontab.5.html\">crontab(5) \u2014 Linux manual page<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.freedesktop.org\/software\/systemd\/man\/systemctl.html\">systemctl reboot \u2014 freedesktop.org<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/man7.org\/linux\/man-pages\/man8\/ping.8.html\">ping(8) \u2014 Linux manual page<\/a><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Catatan Penutup<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Artikel ini disusun berdasarkan pengujian langsung pada lingkungan berikut:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Perangkat:<\/strong> STB HG680P (Amlogic S905X), kompatibel dengan Raspberry Pi dan server mini berbasis Linux lainnya<\/li>\n\n\n\n<li><strong>Sistem Operasi:<\/strong> Armbian (Debian-based), berlaku untuk distro Linux berbasis systemd lainnya<\/li>\n\n\n\n<li><strong>Shell:<\/strong> Bash<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Solusi ini bersifat ringan dan tidak memerlukan dependensi tambahan di luar paket standar yang sudah tersedia pada hampir semua instalasi Linux.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Perangkat headless \u2014 STB Armbian, Raspberry Pi, atau server mini sejenisnya \u2014 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 [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":3445,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[15,46],"tags":[17,105,83,104,102,31,26,103,101,106,65],"class_list":["post-3444","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-armbian","category-homelab","tag-armbian","tag-auto-reboot","tag-bash","tag-cron","tag-headless","tag-linux","tag-monitoring","tag-netwatch","tag-networking","tag-raspberry-pi","tag-stb"],"_links":{"self":[{"href":"https:\/\/rri.my.id\/index.php\/wp-json\/wp\/v2\/posts\/3444","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rri.my.id\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rri.my.id\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rri.my.id\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/rri.my.id\/index.php\/wp-json\/wp\/v2\/comments?post=3444"}],"version-history":[{"count":2,"href":"https:\/\/rri.my.id\/index.php\/wp-json\/wp\/v2\/posts\/3444\/revisions"}],"predecessor-version":[{"id":3448,"href":"https:\/\/rri.my.id\/index.php\/wp-json\/wp\/v2\/posts\/3444\/revisions\/3448"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rri.my.id\/index.php\/wp-json\/wp\/v2\/media\/3445"}],"wp:attachment":[{"href":"https:\/\/rri.my.id\/index.php\/wp-json\/wp\/v2\/media?parent=3444"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rri.my.id\/index.php\/wp-json\/wp\/v2\/categories?post=3444"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rri.my.id\/index.php\/wp-json\/wp\/v2\/tags?post=3444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}