2026年7月3日
2026年7月3日
Linuxのwatchコマンドでコマンドを繰り返し実行する方法:主なオプションとパイプの書き方
watch は、指定したコマンドを一定間隔で実行し、その出力を画面全体に上書き表示し続けるコマンドです。ディスク使用量やプロセス、接続数の変化をその場で追いたいときに使います。この記事では、基本の使い方に加えて、間隔の指定(-n)、変化の強調(-d)、ヘッダーの非表示(-t)、変化したら終了(-g)、エラーで止める(-e)といった主なオプションと、パイプを含むコマンドを渡すときのクォートの付け方を説明します。
watchの基本
watch df -h
これで df -h が2秒ごとに実行され、画面が更新されます。画面の1行目には、実行間隔・コマンド・ホスト名・現在時刻が表示されます。終了するときは Ctrl+C を押します。
多くのLinuxディストリビューションでは、watch は procps(procps-ng)パッケージに含まれていて、最初から使えます。最小構成のコンテナイメージなどで見つからない場合は、Debian/Ubuntuなら procps、RHEL系なら procps-ng をインストールします。macOSには標準で入っていないため、Homebrewで入れるのが一般的です(2026年10月現在)。
# Debian / Ubuntu
sudo apt install procps
# AlmaLinux / Rocky Linux
sudo dnf install procps-ng
表示されるのは端末の画面に収まる範囲だけで、それを超えた行は見えません。行数の多い出力を監視するなら、head や grep で必要な部分に絞ってから watch に渡します。
-n:実行間隔を変える
watch -n 5 df -h
watch -n 0.5 cat /proc/loadavg
-n で秒数を指定します。小数も使え、最小は0.1秒です。間隔を短くするほど負荷も増えるので、重いコマンド(大きなディレクトリに対する du など)は数十秒程度の間隔にします。
既定では、コマンドが終わってから指定秒数待って次を実行します。そのため実際の周期は「実行時間 + 間隔」になります。できるだけ正確な周期で実行したい場合は -p(--precise)を付けます。
-d:変化した部分を強調する
watch -d free -m
watch --differences=permanent free -m
-d(--differences)を付けると、前回の出力から変わった文字が反転表示になります。数字の変化を目で追うときに便利です。--differences=permanent にすると、一度でも変わった箇所が強調されたまま残るので、「どこが動いたか」を後から見渡せます。
-t:ヘッダーを消す
watch -t -n 1 date
-t(--no-title)で1行目のヘッダーと空行を消します。画面の高さが限られているときや、出力だけを大きく見せたいときに使います。
-g:出力が変わったら終了する
# Nginx が active になったら watch を抜けて通知する
watch -g -n 2 systemctl is-active nginx; echo "状態が変わりました"
-g(--chgexit)は、出力が前回と変わった時点で watch を終了します。「サービスが起動するまで待つ」「ファイルが生成されるまで待つ」といった用途で、後ろに通知や次のコマンドをつなげられます。
注意したいのは、出力に時刻や経過秒数が含まれていると毎回変わるため、すぐに終了してしまう点です。比較したい部分だけが出るようにコマンドを組み立ててください。
-e:エラーで止める
watch -e -n 10 'curl -sf -o /dev/null https://example.com/'
-e(--errexit)を付けると、コマンドが0以外の終了コードを返したところで画面の更新を止め、キーを押すと watch が終了します。上の例では curl -f がHTTPエラーで失敗すると止まるので、サイトが落ちた瞬間の画面を残せます。似たオプションに -b(--beep)があり、こちらはエラー時にビープ音を鳴らします。
パイプやリダイレクトを含むときのクォート
watch で一番つまずきやすいのがここです。
# 意図どおりに動かない例
watch ps aux | grep nginx
# 正しい例
watch 'ps aux | grep nginx'
1つ目は、シェルが先に | を解釈するため、「watch ps aux の出力全体を grep に渡す」という意味になります。watch は画面を描き直す制御文字を出し続けるので、何も表示されなかったり、画面が乱れたりします。
watch は受け取った引数を sh -c に渡して実行します。パイプ、リダイレクト、&&、; を含むコマンドは、全体をシングルクォートで囲んで、1つの文字列として watch に渡します。
watch -n 5 'ss -tn state established | wc -l'
watch -n 10 'ls -lt /var/www/html/wp-content/uploads | head -n 15'
watch -n 2 'tail -n 20 /var/log/nginx/error.log'
ダブルクォートとシングルクォートの違いにも注意します。ダブルクォートで囲むと、$変数 や $(コマンド) は watch を起動した時点で一度だけ展開され、以後は同じ値が使われ続けます。毎回展開させたいならシングルクォートを使います。
# 起動時の時刻で固定される
watch "echo $(date +%T)"
# 毎回新しい時刻になる
watch 'echo $(date +%T)'
awk のように中でシングルクォートを使うコマンドは、外側をダブルクォートにし、$ をバックスラッシュでエスケープすると書けます。複雑になるなら、処理を小さなシェルスクリプトにまとめて watch ./check.sh とするほうが読みやすく、間違いも減ります。
また、sh -c は対話シェルではないため、.bashrc に書いたエイリアス(ll など)は使えません。元のコマンド名で書きます。
よく使う監視の例
# ディスクの空きを1分ごとに
watch -n 60 df -h /
# PHP-FPM のプロセス数
watch -n 2 'pgrep -c php-fpm'
# メモリ使用量の変化を強調
watch -d -n 1 free -m
# 特定ポートへの接続数
watch -n 5 'ss -tn state established "( sport = :443 )" | tail -n +2 | wc -l'
色付きで出力するコマンドは、watch に渡すと色の制御文字がそのまま表示されることがあります。-c(--color)を付けると、ANSIの色指定を解釈して表示します。
watchが向かない場面
watch は「今の状態を目で見る」ための道具で、出力を記録しません。変化をログとして残したい場合は、ループで書いてファイルに追記します。
while true; do
printf '%s %s\n' "$(date '+%F %T')" "$(cat /proc/loadavg)" >> /tmp/loadavg.log
sleep 10
done
ログの末尾を流し続けたいだけなら、watch よりも tail -f のほうが適しています。長期間の監視や通知が目的なら、cron や監視ツールに任せたほうが、端末を閉じても止まりません。
まとめ
watch コマンドで2秒ごとに実行、Ctrl+C で終了。間隔は-n、正確な周期は-p-dで変化を強調、-tでヘッダーを消す-gは出力が変わったら終了、-eはエラーで停止。待ち合わせや障害の検知に使える- パイプやリダイレクトを含むときは全体をシングルクォートで囲む。ダブルクォートは起動時に一度だけ展開される
- エイリアスは使えない。記録が要るなら while ループ、ログ追跡なら
tail -f