Perintah watch Linux: Interval, Diff, dan Pipe
Pelajari perintah watch di Linux: interval bawaan 2 detik, cara menyorot perubahan, berhenti saat output berubah, serta mengutip pipe dengan benar.
Fungsi perintah watch
Perintah watch menjalankan ulang perintah lain pada interval tetap dan menggambar ulang outputnya di tempat yang sama pada layar. Interval default-nya adalah dua detik. Gunakan perintah ini saat Anda menunggu suatu angka berubah: penggunaan disk bertambah, container selesai melakukan inisialisasi, pembaruan sertifikat selesai, atau antrean berkurang.
watch berasal dari procps-ng dan sudah terinstal pada VPS Ubuntu atau Debian baru sebagai bagian dari paket procps. Periksa versi Anda sebelum menggunakan flag di bawah ini, karena dua opsi yang berguna baru tersedia pada versi yang lebih baru.
watch --versionPada Ubuntu 24.04, perintah tersebut menampilkan baris seperti watch from procps-ng 4.0.4. Berikut contoh paling sederhana yang berguna.
watch df -h /Layar akan dibersihkan dan menampilkan baris header, satu baris kosong, lalu output dari df -h /:
Every 2.0s: df -h / server1: Sun Aug 9 10:21:44 2026Di sebelah kiri terdapat interval dan perintah persis yang sedang dijalankan oleh watch. Di sebelah kanan terdapat hostname dan waktu saat ini. Jam tersebut adalah bagian yang berguna karena membuktikan bahwa layar masih diperbarui ketika angka di bawahnya tidak berubah. Tekan Ctrl+C untuk keluar.
watch menggambar satu frame yang sesuai dengan ukuran terminal. Baris panjang akan terbungkus, sedangkan -w memotongnya. Apa pun yang berada melewati baris paling bawah tidak akan digambar. Tidak ada scrollback di dalam frame karena setiap siklus menimpa siklus sebelumnya. Fakta ini menentukan sebagian besar penggunaan watch yang tepat.
Seberapa sering watch harus menjalankan ulang perintah?
Dua detik hanyalah nilai bawaan. Tentukan interval berdasarkan seberapa cepat nilai berubah dan seberapa besar beban setiap eksekusi.
-n 0.5untuk penghitung yang terus berubah, sepertiss -satau jumlah byte pada interface. Interval terkecil yang diterima watch adalah 0.1 detik.-n 30atau-n 60untuk disk dan sertifikat. Filesystem yang terisi selama sehari tidak perlu diperbarui tiga puluh kali per menit.
watch menjalankan perintah, menunggu hingga perintah selesai, lalu tidur selama interval yang ditentukan. Waktu eksekusi ditambahkan ke jeda tersebut. Jadi, perintah yang memerlukan delapan detik pada -n 2 menghasilkan satu tampilan setiap sepuluh detik dan membuat mesin tetap sibuk sepanjang waktu. Tambahkan -p (--precise) agar watch berupaya memulai eksekusi setiap beberapa detik sesuai interval. Pengukuran dilakukan dari awal satu eksekusi ke awal eksekusi berikutnya.
Jika Anda selalu ingin menggunakan nilai bawaan yang berbeda, export WATCH_INTERVAL dalam profil shell Anda. -n yang ditentukan secara eksplisit tetap memiliki prioritas lebih tinggi. Jalankan watch --help untuk memastikan build Anda membaca variabel tersebut.
Sorot perubahan dengan -d
Membaca deretan teks identik untuk menemukan satu kolom yang berubah merupakan pekerjaan yang sulit. -d (--differences) melakukannya untuk Anda.
watch -n 30 -d 'df -h / /var'Karakter yang berbeda dari frame sebelumnya ditampilkan dalam video terbalik. Dengan demikian, sel Use% langsung disorot saat nilainya berubah, sedangkan bagian lain tetap tenang. Jika /var bukan filesystem terpisah, filesystem root akan tercantum dua kali. Ini merupakan cara cepat untuk mengetahui bagaimana mesin tersebut dipartisi.
Perbandingan dilakukan berdasarkan posisi. Artinya, baris pada frame baru dibandingkan dengan frame lama karakter demi karakter. Output dengan lebar kolom yang berubah akan hampir seluruhnya disorot. Karena itu, pilih perintah dengan tata letak yang stabil. procps-ng saat ini juga menerima watch --differences=permanent. Opsi ini mempertahankan sorotan pada setiap posisi yang pernah berubah, bukan hanya perubahan terbaru. Konfirmasikan dengan watch --help sebelum mengandalkannya.
Bagaimana cara membuat watch berhenti saat output berubah?
-g (--chgexit) menghentikan watch saat output pertama kali berbeda dari eksekusi sebelumnya. Prompt kembali muncul, sehingga Anda dapat menambahkan perintah setelahnya pada baris yang sama.
watch -n 10 -g 'systemctl is-active myapp' ; echo 'state changed'Flag ini mengubah watch menjadi alat untuk "memberi tahu saat deployment selesai". Ada satu jebakan yang sering terjadi: perbandingan mencakup seluruh output. Karena itu, jam atau PID (process identifier) di dalam output berubah pada refresh pertama, lalu watch langsung berhenti. systemctl status myapp menampilkan waktu yang telah berlalu dan penggunaan memori, sehingga -g pada perintah tersebut tidak berguna. Batasi perintah hanya pada fakta stabil yang sedang ditunggu. Itulah fungsi systemctl is-active.
procps-ng versi yang lebih baru menambahkan pengujian sebaliknya, --equexit <cycles>. Flag ini berhenti setelah output tetap sama selama jumlah siklus tersebut. Fungsinya adalah "memberi tahu saat tidak ada lagi perubahan". Periksa watch --help, karena build yang lebih lama tidak mendukungnya.
Mengapa watch mengabaikan pipe dan glob saya?
Ini adalah masalah yang biasanya dialami semua orang sekali, dan penyebabnya ada di shell Anda, bukan di watch.
watch docker compose ps | grep webShell interaktif membaca seluruh baris sebelum menjalankan apa pun, lalu memisahkan baris tersebut pada pipe. Shell menjalankan watch docker compose ps dan menghubungkan output layar watch sendiri ke grep. watch tidak lagi menulis ke terminal, sehingga tampilannya rusak atau kosong, dan grep menyaring output penggambaran ulang, bukan daftar container.
Kutip seluruh pipeline agar diteruskan sebagai satu argumen.
watch 'docker compose ps | grep web'watch meneruskan string tersebut ke sh -c, lalu shell itu menjalankan pipeline satu kali pada setiap siklus. Glob mengikuti aturan yang sama, tetapi gejalanya lebih sulit terlihat.
watch ls -l /var/log/*.log
watch 'ls -l /var/log/*.log'Baris pertama memperluas glob satu kali di shell Anda saat Anda menekan Enter. Setelah itu watch menjalankan ulang daftar nama file yang sudah tetap, sehingga file log yang dibuat satu menit kemudian tidak pernah muncul. Baris kedua meneruskan glob ke watch, yang memperluasnya di dalam sh pada setiap siklus. Dengan demikian, file baru muncul secara otomatis.
Kutipan juga menentukan kapan variabel atau substitusi perintah dievaluasi. watch "echo $(date)" menjalankan date satu kali di shell Anda, lalu menggemakan string tetap tersebut selamanya. watch 'echo $(date)' menjalankan date pada setiap siklus. Kutip tunggal berarti evaluasi nanti. Kutip ganda berarti evaluasi sekarang.
Ada dua konsekuensi lain dari sh -c tersebut:
- Alias dan fungsi shell tidak tersedia di dalamnya.
watch llgagal dengansh: 1: ll: not foundkarenash -ctidak pernah membaca.bashrcmilik Anda. Tulis perintah sebenarnya, atau berikan path lengkap ke biner yang hanya tersedia diPATHinteraktif Anda. - Standard error sebaiknya ditangkap. Letakkan
2>&1di dalam kutipan jika Anda ingin teks error ditampilkan di dalam frame, bukan tersebar di atasnya.
Jika penggunaan kutipan menjadi rumit, -x (--exec) menjalankan perintah secara langsung, bukan melalui sh -c. Argumen yang mengandung spasi menjadi lebih mudah ditangani, tetapi pipe dan glob sepenuhnya berhenti berfungsi karena tidak ada shell yang menafsirkannya.
Hak akses mengikuti logika yang sama karena watch adalah proses biasa. watch 'sudo ss -tulpn' menampilkan prompt kata sandi yang tidak dapat Anda lihat atau masukkan. Jalankan sudo watch 'ss -tulpn' sebagai gantinya, dan ingat bahwa seluruh loop kemudian berjalan sebagai root sampai Anda menekan Ctrl+C.
Empat hal yang layak dipantau pada VPS
Disk yang terus penuh
watch -n 30 -d 'df -h / /var'df meminta angka yang sudah tersedia di kernel, sehingga cukup ringan untuk diulang terus-menerus. du -sh /var/log tidak demikian, karena perintah ini menelusuri setiap file dalam seluruh hierarki pada setiap siklus. Jika dijalankan dengan watch, perintah ini membaca disk secara terus-menerus dan memperlambat mesin yang sedang Anda diagnosis. Jalankan du satu kali, atau gunakan ncdu, lalu pantau df untuk mengetahui apakah angkanya masih meningkat.
Container yang terus restart
cd /srv/myapp
watch -n 5 -d 'docker compose ps'Kolom status menunjukkan berapa lama setiap container telah berjalan. Container dalam crash loop terus mengatur ulang statusnya menjadi "Up 2 seconds", dan -d menampilkannya dengan jelas. Pindah direktori terlebih dahulu, karena watch mewarisi direktori kerja shell yang menjalankannya dan docker compose memerlukan direktori project-nya. watch memberi tahu bahwa restart sedang terjadi. docker compose logs -f web memberi tahu penyebabnya. Setelah mengetahui penyebabnya, masukkan solusinya ke dalam healthcheck Compose yang merestart container secara otomatis agar tidak ada yang harus duduk menatap layar.
Kedatangan hasil pembaruan sertifikat
sudo -i
watch -n 60 -g 'openssl x509 -noout -enddate -in /etc/letsencrypt/live/example.com/fullchain.pem'Perintah ini mencetak satu baris, notAfter=Nov 7 09:14:22 2026 GMT, dan tidak mencetak apa pun selain itu, sehingga -g berjalan tepat ketika file diganti dengan file hasil pembaruan. File dalam /etc/letsencrypt/live hanya dapat dibaca oleh root, sehingga perintah ini dijalankan dari shell root. Perlu diingat bahwa perintah ini memantau sertifikat pada disk. Web server yang sedang berjalan tetap menggunakan sertifikat lama di memori sampai melakukan reload. Karena itu, periksa sertifikat yang benar-benar disajikan dengan echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -enddate, dan jangan menjalankan perintah tersebut pada interval dua detik terhadap host publik. Proses pembaruan ditangani oleh service dan timer systemd, sedangkan systemctl list-timers menunjukkan kapan proses itu akan berjalan berikutnya.
Antrean yang terus berkurang
watch -n 15 'postqueue -p | tail -n 1'Perintah tersebut mencetak baris ringkasan seperti -- 24 Kbytes in 6 Requests., atau Mail queue is empty setelah proses selesai. Pola yang sama berlaku untuk antrean apa pun yang dapat dihitung: watch -n 5 'find /srv/queue/incoming -type f | wc -l'.
Di sinilah watch memiliki keterbatasan. Perintah ini membandingkan satu frame dengan frame sebelumnya dan tidak dapat menguji kondisi, sehingga tidak pernah dapat memberi tahu Anda bahwa "jumlahnya sudah mencapai nol". Loop shell biasa dapat melakukannya dengan menggunakan substitusi perintah untuk menyimpan jumlah pada setiap perulangan:
until [ "$(find /srv/queue/incoming -type f | wc -l)" -eq 0 ]; do sleep 5; done; echo 'queue drained'Kapan perintah watch merupakan alat yang keliru
watch menjalankan ulang perintah Anda tanpa mengingat hasil eksekusi sebelumnya dan tanpa memahami fungsi perintah tersebut. Ini sesuai untuk df. Namun, watch keliru digunakan dalam empat situasi berikut.
- Log. watch menggambar ulang tampilan tetap, sehingga baris yang muncul lalu bergeser keluar di antara dua siklus akan hilang. Gunakan
journalctl -fu nginxatautail -f, yang mengalirkan baris baru saat ditulis. - Perintah yang membutuhkan banyak sumber daya.
du -sh /atau query ke database yang sibuk akan menjadi beban latar belakang permanen pada interval berapa pun, karena watch terus menjalankannya kembali. - Apa pun yang memiliki efek samping. Perintah yang menulis data, mengirim permintaan, me-restart, atau menginstal akan melakukan tindakan tersebut lagi pada setiap siklus.
curlke API setiap dua detik menghasilkan 43,200 request per hari. Akibatnya, API key gratis dapat ditangguhkan. - Pemeriksaan jangka panjang. watch berjalan di terminal Anda dan berhenti bersama sesi Anda. Perintah ini tidak mengirim alert dan tidak menyimpan riwayat setelah laptop ditutup. Untuk kebutuhan tersebut, gunakan status monitor sungguhan seperti Uptime Kuma, atau pemeriksaan terjadwal yang berjalan di server.
Batas yang tepat ditentukan oleh durasi. watch digunakan selama sepuluh menit ketika Anda menunggu satu hal tertentu terjadi. Apa pun yang harus tetap diperiksa besok harus dijalankan melalui timer terjadwal atau monitor sungguhan.
Jalankan watch di dalam tmux saat menggunakan SSH
Melalui SSH, watch hanya bertahan selama koneksi tetap aktif. Saat koneksi terputus, shell menerima SIGHUP dan ikut menghentikan watch. tmux mengatasi masalah ini. Dengan demikian, watch benar-benar berguna pada server jarak jauh.
tmux new -As ops
watch -n 30 -d 'df -h /'Tekan Ctrl+b lalu d untuk melakukan detach. Loop tetap berjalan di server. Sambungkan kembali nanti dengan tmux attach -t ops. Tampilan tetap diperbarui, dan jam pada header membuktikannya. Bagi jendela tersebut untuk menjalankan watch di satu sisi dan journalctl -f di sisi lain. Inilah inti dari workbench terminal berbasis tmux. Jika pertanyaan yang sama berlaku pada beberapa server sekaligus, gunakan alat untuk mengelola banyak server Linux, bukan memenuhi layar dengan banyak panel watch.
Tampilan yang dikutip di sini hanya ilustrasi. Tata letak kolom dan string versi berbeda-beda pada setiap distribusi dan rilis procps-ng. Karena itu, jalankan man watch pada mesin Anda sendiri untuk melihat flag yang benar-benar tersedia pada build tersebut.
FAQ
Mengapa watch mengabaikan pipe dalam watch mycmd | grep foo?
Shell Anda memisahkan baris tersebut pada pipe sebelum watch dijalankan. Akibatnya, shell meneruskan tampilan layar watch sendiri ke grep, sedangkan output perintah tidak pernah difilter. Kutip seluruh pipeline: watch 'mycmd | grep foo'. watch meneruskan satu argumen tersebut ke sh -c, yang menjalankan pipeline satu kali pada setiap siklus. Aturan yang sama berlaku untuk glob dan substitusi perintah.
Interval berapa yang harus digunakan dengan watch?
Sesuaikan interval dengan kecepatan perubahan nilai dan biaya setiap eksekusi. Interval setengah detik cocok untuk penghitung yang berubah cepat, sedangkan 0.1 detik adalah interval terkecil yang diterima watch. Interval 30 hingga 60 detik cocok untuk disk dan sertifikat. Durasi eksekusi perintah ditambahkan ke jeda, kecuali Anda meneruskan -p. Dengan demikian, perintah lambat di bawah -n 1 akan dijalankan terus-menerus tanpa jeda.
Dapatkah watch mengikuti file log?
Tidak. watch menggambar ulang satu frame dan tidak menyimpan riwayat. Karena itu, baris yang muncul lalu tergeser keluar di antara dua siklus akan hilang. journalctl -fu <unit> dan tail -f mengalirkan baris baru saat tersedia, seperti yang diperlukan oleh log. Gunakan watch untuk nilai yang memiliki keadaan saat ini, seperti persentase disk atau panjang antrean.
Bagaimana cara menghentikan watch ketika hal yang saya tunggu terjadi?
Gunakan -g (--chgexit) dan berikan perintah yang outputnya tetap sama sampai peristiwa tersebut terjadi. Output yang berisi jam atau PID berubah pada refresh pertama dan langsung berhenti, sehingga systemctl is-active myapp berfungsi sedangkan systemctl status myapp tidak. Untuk kondisi nyata, seperti jumlah yang mencapai nol, gunakan loop shell until karena watch hanya dapat mendeteksi bahwa output berubah.
Mengapa watch menampilkan pesan command not found untuk sesuatu yang berfungsi di shell saya?
watch meneruskan perintah ke sh -c. Shell tersebut tidak membaca .bashrc, sehingga alias dan fungsi shell Anda tidak tersedia di sana. Pesan yang muncul biasanya sh: 1: ll: not found. Tuliskan perintah sebenarnya, atau gunakan path lengkap untuk biner yang hanya berada pada PATH interaktif Anda.