watch コマンド
Definition 1 watch コマンド
watchは,指定したコマンドを 一定間隔で繰り返し実行し,結果をフルスクリーンで表示する Linux コマンド実行中は
Ctrl + Cで終了できますwatch [オプション] コマンド
用途として,
- ファイルやプロセスの状態を監視
- GPU 使用率やメモリ使用量などの変化を追跡
- ディレクトリ内の変化を監視
をTerminal上でリアルタイムで確認することが出来ます.
Options
| 短いオプション | 長いオプション | 説明 |
|---|---|---|
-t |
--no-title |
ヘッダ(実行間隔・コマンド名・開始時刻)を非表示 |
-e |
--errexit |
実行したコマンドがエラー(0以外)で終了したら watch も終了 |
-b |
--beep |
エラー時にビープ音を鳴らす |
-d |
--differences |
直前の結果と比較し,変化した箇所をハイライト |
-d=permanent |
初回実行から変化した箇所をハイライト表示 | |
-c |
--color |
ANSI カラー指定を有効にする |
-g |
--chgexit |
実行結果が変化したら watch を終了 |
-n 秒数 |
--interval 秒数 |
実行間隔(秒)を指定,最小 0.1 秒 |
-p |
--precise |
実行タイミングをより厳密に制御 |
-x |
--exec |
コマンドを exec で実行(sh -c ではない) |
コマンドパート動作の仕組み
Note
| コマンド | シェルによる展開のタイミング | 表示される PID |
|---|---|---|
watch echo $$ |
入力した瞬間に展開される | 常に「現在のシェルの PID」 → 変化しない |
watch echo '$$' |
展開されずに watch に渡る → watch 内の sh が展開 | 毎回「新しい sh の PID」 → 変化する |
watch で実行されるコマンドは,そのまま実行されるのではなsh -c <コマンド文字列>として新しいシェルに渡されてから実行されています.
sh -c "<command>"このため,指定したコマンドの引数の中で環境変数やシェル変数を参照したいなど,引用符を使いたい場合は,適宜引用符を補う必要があります.
Example 1 (watch echo $$の場合)
watch echo $$とすると,シェルが先に $$ を展開 してしまいます.つまり,実行時のシェルのPIDが1000なら
watch echo 1000と解釈され実行されます.毎回新しいシェルで展開されることを実現したいならば
wtach echo '$$'とすると
sh -c "echo $$"と解釈され,sh が $$ を展開し,実行時の sh の PID が表示されます.
watchコマンド実践
Case 1: GPUリソースを監視する
Requirements
% gpustat --version
gpustat 1.1.1
% byobu --version
byobu version 6.11
tmux 3.4コマンド
watch -n 1 nvidia-smi- 毎秒(1秒間隔)で
nvidia-smiを再実行し,GPUの状態を表示するコマンド
watch -n 1 gpustat --color- 毎秒(1秒間隔)で
gpustatを再実行し,GPUの状態をカラー表示で更新するコマンド nvidia-smiと比べ表示がコンパクト
Tips
Byobuを用いている場合はShift+F2で上下にwindowをsplitして,Alt+Shift+↑/↓で表示を領域をコンパクトにできるGnome Terminatorの場合はCtrl+Shift+Oで上下split,その後Ctrl+Shift+↑/↓で表示を領域をresize
Case 2: メモリリソースを監視する
コマンド
watch -n 1 free -h- 毎秒(1秒間隔)で
free -hを再実行し,メモリとSwapの使用状況を表示するコマンド - available 列を見ることで,アプリが実際に使えるメモリ量を把握できる
Case 3: Dockerの起動状態を確認する
コマンド
watch -n 30 -t "docker ps"| オプション/コマンド | 説明 |
|---|---|
watch |
コマンドを定期実行 |
-n 30 |
30秒ごとに実行 |
-t |
ヘッダーを非表示 |
docker ps |
現在動作中の Docker コンテナを一覧表示 |
- 引用符
"はなくても僕の環境では動作しますが,常に安全に動かすには引用符で囲む方が安全とのことです.
Case 4: Memory Usageの確認
コマンド
watch -n 1 free -m表示結果例は以下
total used free shared buff/cache available
Mem: 63439 7314 46771 216 9898 56124
Swap: 8191 0 8191| 項目 | サイズ (MB) | 説明 |
|---|---|---|
| total | 63439 | システム全体の物理メモリ量(約63GB) |
| used | 7314 | OSやプロセスによって現在使用中のメモリ量(キャッシュ・バッファ含む) |
| free | 46771 | 現在まったく使用されていない空きメモリ |
| shared | 216 | プロセス間で共有されているメモリ(最近の Linux では重要度低め) |
| buff/cache | 9898 | ファイルキャッシュやバッファとして使われているメモリ(必要なら解放可能) |
| available | 56124 | 実際に新しいアプリが使えるメモリ(キャッシュ分も含めて計算済み) |
メモリの逼迫度や空き容量は基本的には available フィールドの値を見て判断します.
NoteCache領域
- ディスクキャッシュは,最近アクセスしたファイルを RAM に保持する仕組み
- Linuxは未使用のメモリをディスクキャッシュ用に利用する
- キャッシュはアプリからメモリを奪うことはなく,性能向上にだけ使われる
usedにはキャッシュも含まれるので,見た目だけでは「メモリ不足」に見えることがあることに注意