SSD Nodes Learn 🎉 VPS dari $5.50/bln
Panduan Matt ConnorOleh Matt Connor · Dikemas kini 2026-08-13

Cara Guna Arahan watch Linux Dengan Betul

Ketahui cara menggunakan arahan watch untuk menjalankan skrip pada selang masa tetap. Panduan ini merangkumi penggunaan flag -d, -g, petikan paip, dan tetapan masa.

Apakah fungsi arahan watch

Arahan watch menjalankan semula arahan lain pada selang masa tetap dan melukis semula keluarannya di tempat yang sama pada skrin. Selang masa lalai ialah dua saat. Gunakan arahan ini apabila anda menunggu sesuatu nilai berubah: cakera yang semakin penuh, kontena yang sedang stabil, pembaharuan sijil yang sedang diproses, atau baris gilir yang sedang dikosongkan.

watch datang daripada procps-ng dan sudah dipasang pada VPS Ubuntu atau Debian baharu sebagai sebahagian daripada pakej procps. Semak versi anda sebelum mempercayai mana-mana flag di bawah, kerana dua daripada pilihan yang berguna adalah ciri baharu.

watch --version

Pada Ubuntu 24.04, ia mencetak baris seperti watch from procps-ng 4.0.4. Sekarang, contoh paling mudah yang berguna.

watch df -h /

Skrin akan dibersihkan dan memaparkan baris pengepala, satu baris kosong, kemudian keluaran df -h /:

Every 2.0s: df -h /                          server1: Sun Aug  9 10:21:44 2026

Di sebelah kiri ialah selang masa dan arahan tepat yang sedang dijalankan oleh watch. Di sebelah kanan ialah nama hos dan waktu semasa. Jam tersebut adalah bahagian yang berguna, kerana ia membuktikan skrin masih disegarkan apabila nombor di bawahnya tidak berubah. Tekan Ctrl+C untuk keluar.

watch melukis satu bingkai yang muat dengan terminal. Baris yang panjang akan dibalut, manakala -w akan memotongnya, dan apa-apa yang melepasi baris bawah tidak akan dilukis langsung. Tiada tatalan ke belakang di dalam bingkai tersebut, kerana setiap kitaran akan menulis ganti kitaran sebelumnya. Fakta tunggal ini menentukan kebanyakan kegunaan watch.

Berapa kerapkah watch perlu menjalankan semula arahan?

Dua saat hanyalah nilai lalai. Pilih selang masa berdasarkan kepantasan nilai berubah dan kos setiap pelaksanaan.

  • -n 0.5 untuk pembilang yang sentiasa berubah, seperti ss -s atau kiraan bait antara muka. Selang masa terkecil yang diterima oleh watch ialah 0.1 saat.
  • -n 30 atau -n 60 untuk cakera dan sijil. Sistem fail yang penuh dalam masa sehari tidak memerlukan tiga puluh bingkai seminit.

watch menjalankan arahan, menunggu sehingga selesai, dan hanya kemudian tidur mengikut selang masa tersebut. Masa pelaksanaan ditambah kepada jurang masa, jadi arahan yang mengambil masa lapan saat di bawah -n 2 memberikan anda satu bingkai setiap sepuluh saat dan memastikan mesin sibuk sepanjang masa. Tambahkan -p (--precise) dan watch akan menyasarkan untuk memulakan pelaksanaan setiap selang saat, diukur dari permulaan satu pelaksanaan ke permulaan pelaksanaan seterusnya.

Jika anda sentiasa mahukan nilai lalai yang berbeza, eksport WATCH_INTERVAL dalam profil shell anda. -n yang eksplisit tetap akan mengatasi nilai tersebut. Jalankan watch --help untuk mengesahkan binaan anda membaca pemboleh ubah tersebut.

Menyerlahkan perubahan dengan -d

Membaca teks yang sama untuk mencari satu medan yang berubah adalah sukar. -d (--differences) melakukan tugas ini untuk anda.

watch -n 30 -d 'df -h / /var'

Aksara yang berbeza daripada bingkai sebelumnya akan dipaparkan dalam video terbalik, jadi sel Use% akan menyala sebaik sahaja ia berubah manakala bahagian lain kekal statik. Jika /var bukan sistem fail yang berasingan, anda akan melihat sistem fail root disenaraikan dua kali; ini adalah cara pantas untuk mengetahui bagaimana pelayan tersebut dipartisikan.

Perbandingan ini adalah berdasarkan kedudukan, yang bermaksud -d menyelaraskan baris bingkai baharu dengan bingkai lama aksara demi aksara. Output yang lebar kolumnya berubah akan menyala hampir sepenuhnya, jadi gunakan arahan dengan susun atur yang stabil. watch --differences=permanent dalam procps-ng semasa juga diterima, yang mengekalkan setiap kedudukan yang pernah berubah dalam keadaan terserlah dan bukannya hanya perubahan terkini. Sahkan perkara ini dengan watch --help sebelum anda bergantung kepadanya.

Bagaimanakah cara untuk menghentikan watch apabila output berubah?

-g (--chgexit) akan menghentikan watch sebaik sahaja output berbeza daripada larian sebelumnya. Prompt anda akan kembali, jadi anda boleh meletakkan arahan lain selepasnya pada baris yang sama.

watch -n 10 -g 'systemctl is-active myapp' ; echo 'state changed'

Ini ialah flag yang menukarkan watch menjadi alat "beritahu saya apabila deploy selesai". Ia mempunyai satu perangkap yang sering memerangkap pengguna: perbandingan merangkumi keseluruhan output, jadi sebarang jam atau PID (process identifier) di dalamnya akan berubah pada refresh pertama dan watch akan terus berhenti. systemctl status myapp mencetak masa yang berlalu dan penggunaan memori, jadi penggunaan -g padanya adalah sia-sia. Ringkaskan arahan kepada fakta stabil tunggal yang anda tunggu, iaitu apa yang diberikan oleh systemctl is-active.

Versi procps-ng yang lebih baharu menambah ujian bertentangan, --equexit <cycles>, yang berhenti selepas output kekal sama untuk bilangan kitaran tersebut. Ia menjawab soalan "beritahu saya apabila ini telah menjadi senyap". Semak watch --help, kerana binaan yang lebih lama tidak menyertakannya.

Mengapa watch mengabaikan pipe dan glob saya?

Ini adalah kegagalan yang sering dihadapi oleh semua orang, dan puncanya terletak pada shell anda dan bukannya pada watch.

watch docker compose ps | grep web

Shell interaktif anda membaca keseluruhan baris sebelum sebarang arahan dijalankan, dan ia memisahkan baris tersebut pada tanda pipe. Ia memulakan watch docker compose ps dan menyambungkan output skrin watch sendiri kepada grep. watch tidak lagi menulis ke terminal, jadi paparan menjadi rosak atau kosong, dan grep menapis output lukisan semula (redraw) dan bukannya senarai kontena.

Letakkan tanda petikan pada keseluruhan pipeline supaya ia diterima sebagai satu argumen.

watch 'docker compose ps | grep web'

watch menghantar rentetan tersebut kepada sh -c, dan shell tersebut menjalankan pipeline itu sekali bagi setiap kitaran. Glob mengikut peraturan yang sama dengan simptom yang lebih senyap.

watch ls -l /var/log/*.log
watch 'ls -l /var/log/*.log'

Baris pertama mengembangkan glob sekali, di dalam shell anda, pada saat anda menekan Enter. watch kemudian menjalankan semula senarai nama fail yang telah dibekukan, jadi fail log yang dicipta seminit kemudian tidak akan muncul. Baris kedua menyerahkan glob kepada watch, yang mengembangkannya di dalam sh pada setiap kitaran, jadi fail baharu akan muncul dengan sendirinya.

Tanda petikan juga menentukan bila pemboleh ubah atau penggantian arahan (command substitution) dinilai. watch "echo $(date)" menjalankan date sekali, di dalam shell anda, kemudian menggemakan rentetan tetap itu selama-lamanya. watch 'echo $(date)' menjalankan date pada setiap kitaran. Tanda petikan tunggal bermaksud kemudian. Tanda petikan berganda bermaksud sekarang.

Dua lagi akibat daripada sh -c tersebut:

  • Alias dan fungsi shell tidak wujud di dalamnya. watch ll gagal dengan sh: 1: ll: not found, kerana sh -c tidak pernah membaca .bashrc anda. Tulis arahan sebenar sepenuhnya, atau berikan laluan penuh kepada binari yang hanya ada pada PATH interaktif anda.
  • Ralat standard (standard error) perlu ditangkap. Letakkan 2>&1 di dalam tanda petikan apabila anda mahu teks ralat dipaparkan dalam bingkai dan bukannya bertaburan di atasnya.

Apabila penggunaan tanda petikan menjadi sukar, -x (--exec) menjalankan arahan secara terus dan bukannya melalui sh -c. Argumen dengan ruang menjadi lebih mudah, dan pipe serta glob berhenti berfungsi sepenuhnya, kerana tiada shell yang tinggal untuk mentafsirkannya.

Keistimewaan (privileges) mengikut logik yang sama, memandangkan watch adalah proses biasa. watch 'sudo ss -tulpn' akan menemui gesaan kata laluan yang anda tidak dapat lihat atau taip. Jalankan sudo watch 'ss -tulpn' sebaliknya, dan ingat bahawa keseluruhan gelung tersebut kemudian berjalan sebagai root sehingga anda menekan Ctrl+C.

Empat perkara yang perlu dipantau pada VPS

Cakera yang semakin penuh

watch -n 30 -d 'df -h / /var'

df meminta angka daripada kernel yang sudah sedia ada, jadi ia cukup ringan untuk dijalankan berulang kali. du -sh /var/log pula tidak, kerana ia menyemak setiap fail dalam pepohon direktori pada setiap kitaran. Apabila dipantau, ia membaca cakera secara berterusan dan melambatkan mesin yang sedang anda diagnosis. Jalankan du sekali sahaja, atau gunakan ncdu, kemudian biarkan df dipantau untuk memberitahu anda sama ada angka tersebut masih meningkat.

Kontena yang sentiasa dimulakan semula

cd /srv/myapp
watch -n 5 -d 'docker compose ps'

Lajur status menunjukkan berapa lama setiap kontena telah berjalan. Kontena dalam gelung ranap (crash loop) akan sentiasa menetapkan semula kepada "Up 2 seconds", dan -d menjadikan perkara itu jelas sepintas lalu. Tukar direktori terlebih dahulu, kerana watch mewarisi direktori kerja shell yang memulakannya dan docker compose memerlukan direktori projeknya. watch memberitahu anda bahawa permulaan semula sedang berlaku. docker compose logs -f web memberitahu anda sebabnya. Sebaik sahaja anda tahu sebabnya, kodkan jawapan tersebut sebagai healthcheck Compose yang memulakan semula kontena untuk anda supaya tiada sesiapa perlu duduk dan merenung skrin.

Pembaharuan sijil yang tiba

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 tiada yang lain, jadi -g akan tercetus tepat apabila fail tersebut digantikan dengan yang baharu. Fail di bawah /etc/letsencrypt/live hanya boleh dibaca oleh root, itulah sebabnya ia dijalankan dalam shell root. Ambil perhatian bahawa ia memantau sijil pada cakera. Pelayan web yang sedang berjalan menyimpan sijil lama dalam memori sehingga ia dimuatkan semula, jadi semak perkara yang sebenarnya dihidangkan dengan echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -enddate, dan jangan letakkan perintah itu pada selang dua saat terhadap hos awam. Pembaharuan itu sendiri adalah di bawah tanggungjawab servis dan pemasa systemd, dan systemctl list-timers menunjukkan bila ia akan dijalankan seterusnya.

Baris gilir yang sedang dikosongkan

watch -n 15 'postqueue -p | tail -n 1'

Perintah itu mencetak baris ringkasan seperti -- 24 Kbytes in 6 Requests., atau Mail queue is empty apabila ia selesai. Bentuk yang sama berfungsi untuk mana-mana baris gilir yang boleh anda kira: watch -n 5 'find /srv/queue/incoming -type f | wc -l'.

Di sini watch mencapai hadnya. Ia membandingkan satu bingkai dengan bingkai sebelumnya, dan ia tidak boleh menguji syarat, jadi ia tidak akan dapat memberitahu anda "kiraan telah mencapai sifar". Gelung shell biasa boleh melakukannya, dengan menggunakan penggantian perintah untuk menangkap kiraan pada setiap laluan:

until [ "$(find /srv/queue/incoming -type f | wc -l)" -eq 0 ]; do sleep 5; done; echo 'queue drained'

Apabila arahan watch bukan alat yang sesuai

watch menjalankan semula arahan anda tanpa menyimpan memori larian sebelumnya dan tanpa mengetahui fungsi arahan tersebut. Ini sesuai untuk df. Ia tidak sesuai dalam empat situasi berikut.

  • Log. watch melukis semula bingkai tetap, jadi baris yang muncul dan hilang antara dua kitaran akan terlepas. Gunakan journalctl -fu nginx atau tail -f, yang menstrim baris baharu sebaik sahaja ia ditulis.
  • Arahan yang memakan sumber. du -sh / atau pertanyaan terhadap pangkalan data yang sibuk akan menjadi beban latar belakang kekal pada sebarang selang masa, kerana watch terus memulakannya semula.
  • Apa-apa sahaja dengan kesan sampingan. Arahan yang menulis, menghantar, memulakan semula atau memasang sesuatu akan melakukannya semula pada setiap kitaran. curl terhadap API setiap dua saat bermakna 43,200 permintaan sehari, yang merupakan punca kunci API percuma digantung.
  • Semakan jangka panjang. watch berjalan dalam terminal anda dan akan tamat apabila sesi anda berakhir. Ia tidak memaklumkan sesiapa dan tidak menyimpan sejarah selepas anda menutup komputer riba. Untuk tujuan itu, anda memerlukan pemantau status sebenar seperti Uptime Kuma, atau semakan berjadual yang kekal berjalan pada pelayan.

Sempadan yang jelas adalah masa. watch adalah untuk sepuluh minit yang anda luangkan sementara menunggu sesuatu perkara khusus berlaku. Apa-apa sahaja yang masih perlu disemak pada hari esok sepatutnya diletakkan dalam pemasa berjadual atau pemantau sebenar.

Jalankan watch di dalam tmux semasa anda menggunakan SSH

Melalui SSH, ketahanan watch bergantung sepenuhnya pada sambungan rangkaian. Apabila pautan terputus, shell anda menerima SIGHUP dan menamatkan proses watch. tmux menyelesaikan masalah ini, dan inilah yang menjadikan watch benar-benar berguna pada pelayan jauh.

tmux new -As ops
watch -n 30 -d 'df -h /'

Tekan Ctrl+b kemudian d untuk melakukan detach. Gelung tersebut terus berjalan pada pelayan. Sambung semula kemudian dengan tmux attach -t ops dan bingkai tersebut masih dikemas kini, dengan jam pada pengepala sebagai bukti. Bahagikan tetingkap dan anda boleh mengekalkan watch pada satu sisi dan journalctl -f pada sisi yang lain, yang merupakan konsep utama di sebalik meja kerja terminal berasaskan tmux. Apabila soalan yang sama terpakai kepada beberapa pelayan serentak, itu adalah tugas untuk alat yang dibina untuk mengurus banyak pelayan Linux dan bukannya sekadar deretan panel watch.

Paparan skrin yang dipetik di sini adalah sebagai ilustrasi. Susun atur lajur dan rentetan versi mungkin berbeza antara pengedaran dan keluaran procps-ng, jadi baca man watch pada mesin anda sendiri untuk melihat flag yang benar-benar disokong oleh binaan anda.

FAQ

Mengapakah watch mengabaikan pipe dalam watch mycmd | grep foo?

Shell anda memisahkan baris tersebut pada pipe sebelum watch bermula, jadi ia menyalurkan paparan skrin watch sendiri ke dalam grep, dan output arahan tersebut tidak pernah ditapis. Letakkan tanda petikan pada keseluruhan pipeline sebaliknya: watch 'mycmd | grep foo'. watch menyerahkan argumen tunggal itu kepada sh -c, yang menjalankan pipeline tersebut sekali bagi setiap kitaran. Peraturan yang sama terpakai untuk glob dan penggantian arahan (command substitution).

Berapakah selang masa yang perlu saya gunakan dengan watch?

Padankan dengan kelajuan perubahan nilai tersebut dan kos bagi satu pelaksanaan. Setengah saat sesuai untuk pembilang pantas, dan 0.1 saat ialah selang masa terkecil yang diterima oleh watch. Tiga puluh hingga enam puluh saat sesuai untuk cakera dan sijil. Masa jalan arahan akan ditambah kepada jurang masa kecuali anda menggunakan -p, jadi arahan yang perlahan di bawah -n 1 akan terus berjalan berturut-turut tanpa jeda.

Bolehkah watch mengikuti fail log?

Tidak. watch melukis semula satu bingkai dan tidak menyimpan sejarah, jadi mana-mana baris yang muncul dan hilang antara dua kitaran akan hilang selama-lamanya. journalctl -fu <unit> dan tail -f menstrim baris baharu sebaik sahaja ia tiba, iaitu perkara yang diperlukan oleh log. Gunakan watch untuk nilai yang mempunyai keadaan semasa, seperti peratusan cakera atau panjang baris gilir.

Bagaimanakah cara untuk menghentikan watch apabila perkara yang saya tunggu berlaku?

Gunakan -g (--chgexit) dan berikan arahan yang outputnya kekal sama sehingga peristiwa itu berlaku. Output yang mengandungi jam atau PID akan berubah pada muat semula pertama dan keluar serta-merta, jadi systemctl is-active myapp berfungsi di tempat yang systemctl status myapp tidak berfungsi. Untuk keadaan sebenar seperti kiraan mencapai sifar, gunakan gelung until shell, kerana watch hanya boleh mengesan bahawa output telah berubah.

Mengapakah watch menyatakan command not found untuk sesuatu yang berfungsi dalam shell saya?

watch menyerahkan arahan tersebut kepada sh -c, dan shell tersebut tidak membaca .bashrc, jadi alias dan fungsi shell anda tidak wujud di sana. Mesej tersebut biasanya ialah sh: 1: ll: not found. Tulis arahan sebenar tersebut, atau gunakan laluan penuh untuk binari yang hanya terletak pada PATH interaktif anda.