watchコマンド: 使い方と-n間隔、-d強調、出力が変わったら終了
watchコマンドは、指定したコマンドを2秒ごとに実行し直し、その出力をターミナル画面全体に描き直すLinuxコマンドです。AlmaLinux 9サーバーで別のウィンドウからファイルを変えながらwatchで見たところ、-dオプションは変わった文字を強調し、-gオプションは出力が変わった後にwatchを終了しました。
以下の出力はAlmaLinux 9.8サーバー(rootアカウント)の作業フォルダーで実行した結果で、Debian 12サーバーではバージョンだけを確認しました。画面最上部のヘッダー行のホスト名は例の値server1に変え、時刻はUTCで出力しました。
1️⃣ watchコマンドの使い方
watchの後ろに繰り返し実行するコマンドを書くと、オプションがない場合は2秒ごとにそのコマンドを実行して画面を新しい出力に置き換えます。dateを見ると画面の最上部にヘッダー行が表示され、1行空けてdateの出力が続きました。
watch dateEvery 2.0s: date server1: Thu Oct 29 02:28:07 2026
Thu Oct 29 02:28:07 UTC 2026ヘッダー行の左側は更新間隔と実行中のコマンド、右側はホスト名と最後に実行した時刻です。2秒後に同じ画面をもう一度確認すると、ヘッダー行の時刻とdateの出力がそろって変わっていました。
Every 2.0s: date server1: Thu Oct 29 02:28:09 2026
Thu Oct 29 02:28:09 UTC 2026watchは自分で終了するまで実行し続けるため、Ctrl+Cで終了します。Ctrl+Cを押すとwatchの画面が消え、プロンプトが戻りました。続けて確認した終了コードは0でした。
echo $?0watchは、一度出力して終わるコマンドを繰り返し実行するときに使います。プロセスごとにCPUとメモリの使用量が変わる様子を見るなら、画面を自分で描き直す top コマンドが向いています。
watchはprocps-ngパッケージに含まれるコマンドです。バージョンは[watch -v]で確認でき、AlmaLinux 9.8サーバーは3.3.17、Debian 12サーバーは4.0.2でした。
watch -vwatch from procps-ng 3.3.17watch -vwatch from procps-ng 4.0.22️⃣ watchの間隔と強調オプション
-nの後ろに秒数を書くと更新間隔が変わります。[watch -n 1 date]で実行すると、ヘッダー行の左側がEvery 1.0sに変わりました。
watch -n 1 dateEvery 1.0s: date server1: Thu Oct 29 02:28:15 2026
Thu Oct 29 02:28:15 UTC 2026manページによると、間隔は0.1秒より短くできず、それより小さい値は0.1秒になります。小数点はピリオドとカンマのどちらも認識します。
-dは直前の更新と違う文字を強調します。作業フォルダーのsize.logを[ls -l]で見ている間に、別のウィンドウからこのファイルに1行追加しました。
watch -d -n 1 ls -l size.logEvery 1.0s: ls -l size.log server1: Thu Oct 29 02:28:53 2026
-rw-r--r-- 1 root root 7 Oct 29 02:28 size.logprintf 'line 2\n' >> size.logファイルサイズが7から14に変わると、サイズの欄から行末までが強調されました。数字が1桁増えて、その後ろの文字がすべて1文字ずつずれたためです。次の更新では値が同じだったので強調が消えました。
Every 1.0s: ls -l size.log server1: Thu Oct 29 02:28:54 2026
-rw-r--r-- 1 root root 14 Oct 29 02:28 size.log最初の実行と比べて変わった箇所を強調し続けるには[--differences=permanent]を使います(manページ基準)。
-tはヘッダー行とその下の空行をなくし、コマンドの出力だけを残します。
watch -t -n 1 dateThu Oct 29 02:28:19 UTC 20263️⃣ watchコマンドの終了条件とオプション
-gはコマンドの出力が変わるとwatchを終了します。状態ファイルの内容が変わるのを待ってから次の作業に進むときに使います。
watch -g -n 1 cat status.txtEvery 1.0s: cat status.txt server1: Thu Oct 29 02:29:12 2026
running別のウィンドウから、下のコマンドでstatus.txtの内容をdoneに変えました。
printf 'done\n' > status.txtするとwatchが終了してプロンプトが戻り、終了コードは0でした。
echo $?0-eはコマンドが0以外の終了コードで終わると画面の更新を止めます。作業フォルダーにないファイルをlsで見ると、lsのエラー出力とともに、画面の最下行にキーを押すと終了するという案内が表示されました。
watch -e -n 1 ls nofile.txtEvery 1.0s: ls nofile.txt server1: Thu Oct 29 02:29:18 2026
ls: cannot access 'nofile.txt': No such file or directory
command exit with a non-zero status, press a key to exitヘッダー行の時刻は実行直後の時刻で止まっていて、キーを1つ押すとwatchが終了しました。このときの終了コードは8でした。
echo $?8manページは終了コード8を、コマンドがエラーで終わった場合を含む値として説明しています。
📌 主なオプション: この記事で実行した結果
| オプション | 作業 | この記事で確認した結果 | |
|---|---|---|---|
| -n 秒 | 更新間隔を変える(既定は2秒) | ヘッダー行がEvery 1.0sに変わった | |
| -d | 直前の更新と違う文字を強調 | ファイルサイズ7 → 14でその欄から行末まで強調、次の更新で消えた | |
| -t | ヘッダー行とその下の空行を消す | dateの出力1行だけが残った | |
| -g | 出力が変わるとwatchを終了 | running → doneの後に終了、終了コード0 | |
| -e | コマンドがエラーで終わると画面を止める | キーを押すと終了、終了コード8 | |
| -v | バージョン情報を出力 | AlmaLinux 9.8サーバーはwatch from procps-ng 3.3.17、Debian 12サーバーはwatch from procps-ng 4.0.2 |
📎 その他のオプション: 公式マニュアルより
| オプション | 作業 | |
|---|---|---|
| -b | コマンドが0以外の終了コードで終わるとビープ音を鳴らす | |
| -c | ANSIの色と文字スタイルのコードを解釈し、コマンド出力の色をそのまま出力 | |
| -p | 間隔ごとに実行するよう合わせ、更新時刻が後ろにずれないようにする | |
| -x | コマンドをsh -cの代わりにexecで実行し、引用符を減らせる | |
| -w | 長い行を次の行に折り返さず切って出力 | |
| --differences=permanent | 最初の実行以降に変わった箇所をすべて強調し続ける | |
| -h | ヘルプを出力 |
4️⃣ watchコマンドの引用符とパイプ
watchは受け取ったコマンドをsh -cで実行するため、 パイプ(|)や$を含むコマンドは、コマンド全体をシングルクォートで囲みます。作業フォルダーのファイル数を[ls | wc -l]で見ると、ヘッダー行にパイプまで含めたコマンド全体が表示されました。
watch -n 1 'ls | wc -l'Every 1.0s: ls | wc -l server1: Thu Oct 29 02:30:22 2026
6別のウィンドウでファイルを1つ作ると、次の更新で数字が6から7に変わりました。
printf 'c\n' > q3.txtEvery 1.0s: ls | wc -l server1: Thu Oct 29 02:30:24 2026
7引用符なしで[watch -n 1 ls | wc -l]と入力すると、シェルが先にパイプを分けるため、watchの画面出力全体がwcに渡ります。そのため、監視するコマンドにパイプがあるときはコマンド全体を引用符で囲みます。
$も同じルールに従います。引用符なしで[watch -n 1 echo $$]を実行すると、今のシェルが先に$$を数字に置き換え、ヘッダー行のコマンドにもその数字が表示されました。
watch -n 1 echo $$Every 1.0s: echo 3755802 server1: Thu Oct 29 02:29:37 2026
3755802シングルクォートで囲むと$$がそのまま渡るため、ヘッダー行にはecho $$が表示され、更新のたびに新しく実行したshのPIDが出力されました。
watch -n 1 'echo $$'Every 1.0s: echo $$ server1: Thu Oct 29 02:29:40 2026
3756270Every 1.0s: echo $$ server1: Thu Oct 29 02:29:41 2026
3756333今のシェルのPIDを[echo $$]で確認すると、引用符なしで実行したときに固定されていた数字と同じでした。
echo $$3755802ディスク使用量のようにゆっくり変わる値は、間隔を数秒にして監視します。 duコマンドの-sは合計だけを、-hはK・Mのような単位で出力します。作業フォルダーを[du -sh .]で見ている間に別のウィンドウからログファイルに8,001バイト追加すると、次の更新で28Kが36Kに変わりました。
watch -n 2 du -sh .Every 2.0s: du -sh . server1: Thu Oct 29 02:30:34 2026
28K .printf '000d\n' 0 >> grow.logEvery 2.0s: du -sh . server1: Thu Oct 29 02:30:36 2026
36K .🔲 watchコマンドシミュレーター
下のシミュレーターでwatchを実行したあと、[🖊 別のウィンドウ]チップでファイルを変えながら、画面がどう変わるかを直接確かめられます。
🔢 FAQ & おすすめコンテンツ
ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。