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

お気軽にご相談ください

お見積りへ お問い合わせへ
▲