LinuxサーバーでCPU使用率やメモリ使用率を調査するとき、「しばらく時間を置いてリソース状況を記録したい」と思ったことはありませんか?
例えば以下のような場面です。
- 障害発生時のCPU・メモリ推移を確認したい
- 高負荷になる時間帯を調査したい
- サーバーのリソース使用状況をログとして残したい
- cronやシェルスクリプトを使わず簡単に取得したい
この記事では、forやwhileループを一切使わずにLinuxの top コマンドを使って、1分ごとに30回、自動でログを取得してファイルへ保存する方法を初心者向けに解説します。
この記事を読むと次の内容がわかります。
topコマンドの基本-b-d-nオプションの意味nohupを使ったバックグラウンド実行方法- ログ確認方法
- よくあるエラーと対処法
topコマンドとは?
top コマンドはLinuxで現在動作しているプロセスやCPU・メモリ使用率などをリアルタイム表示するコマンドです。
通常は以下のように使用します。
$ top
実行すると画面が更新され続けます。
$ top
top - 20:44:44 up 0 min, 1 user, load average: 0.32, 0.07, 0.02
Tasks: 57 total, 1 running, 56 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.1 us, 0.0 sy, 0.0 ni, 98.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7816.2 total, 7043.9 free, 495.9 used, 426.4 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 7320.3 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
463 hayana 20 0 9272 5120 3072 R 9.1 0.1 0:00.01 top
1 root 20 0 21628 12356 9156 S 0.0 0.2 0:00.61 systemd
2 root 20 0 3060 1664 1664 S 0.0 0.0 0:00.00 init-systemd(Ub
6 root 20 0 3484 2176 1792 S 0.0 0.0 0:00.00 init
52 root 19 -1 42096 15616 14720 S 0.0 0.2 0:00.13 systemd-journal
100 root 20 0 25400 6400 4864 S 0.0 0.1 0:00.11 systemd-udevd
111 systemd+ 20 0 21452 12288 10240 S 0.0 0.2 0:00.15 systemd-resolve
ただし、この方法では画面上に表示するだけなので、後から分析したい場合には不向きです。
ログとして保存したい場合はバッチモードを使います。
topコマンドを1分ごとに30回自動保存する方法
今回使用するコマンドはこちらです。
# nohup top -b -d 60 -n 30 > /tmp/web_top_result$(date +%Y%m%d_%H%M%S).txt 2>&1 &
これだけで以下を実現できます。
- 1分ごとに実行
- 30回取得
- ファイルへ保存
- バックグラウンド実行
- ログアウト後も継続
コマンドの意味を1つずつ解説
構文
# nohup top -b -d 秒数 -n 回数 > ファイル名 &
各オプションの意味
| コマンド/オプション | 説明 |
nohup |
ログアウトしても処理継続 |
-b |
バッチモード(ファイル出力用) |
-d 60 |
60秒間隔で更新 |
-n 30 |
30回取得したら終了 |
> |
ファイルへ出力 |
$(date) |
日時をファイル名に追加 |
& |
バックグラウンド実行 |
実際の出力ファイル名
このコマンドを実行直後に以下のファイルが出力され、1分毎にこのファイルにtopコマンドの出力結果が追記されます。
/tmp/web_top_result20260525_103000.txt
日時を含めることで、複数回実行してもファイルが上書きされないので取りたかったログが消えちゃった。。。みたいなことを防ぐことができます。
実行結果の例
このコマンドを実行すると、標準出力では以下のように表示されます。
# nohup top -b -d 60 -n 30 > /tmp/web_top_result$(date +%Y%m%d_%H%M%S).txt 2>&1 &
[1] 2943848
[1] 2943848の番号はプロセスIDなので、控えておくと途中で止めたいときとかに使えます。
保存されたファイルの中身は次のようなログが1分ごとに追記されていき、30個追記されたらプロセスが停止します。
top - 10:30:01 up 5 days, 4 users, load average: 0.15,0.10,0.08
Tasks: 198 total, 1 running
%Cpu(s): 1.5 us, 0.3 sy, 98.2 id
MiB Mem : 7845 total, 1020 free, 3120 used
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 169040 7568 3740 S 0.0 1.6 237:47.42 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:08.32 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par+
・
・
・
実行中か確認する方法
以下のコマンドでプロセス一覧を確認します。
# ps -aux | grep top
実行例
# ps -aux | grep top
root 2943848 0.0 0.8 10516 4000 pts/0 S 19:24 0:00 top -b -d 60 -n 30
root 2944192 0.0 0.4 6404 2280 pts/2 S+ 19:30 0:00 grep --color=auto toproot 12345 1 0 10:00 ? 00:00:00 top -b -d 60 -n 30
これの2行目が実行中のプロセスです。
2行目に記載されている「2943848」というのが、プロセスIDです。
実行したtopコマンドを停止する方法
実行した後にやっぱり間違えたから停止したい!ってなったときは以下のコマンドで停止できます。
# kill 2943848
実行例
停止する前
# ps -aux | grep top
root 2943848 0.0 0.8 10516 3944 pts/0 S 19:24 0:00 top -b -d 60 -n 30
root 2945117 0.0 0.5 6404 2352 pts/2 S+ 19:48 0:00 grep --color=auto top
停止コマンド
[root@os3-378-22389 ~]# kill 2943848
停止後
[root@os3-378-22389 ~]# ps -aux | grep top
root 2945121 0.0 0.4 6404 2140 pts/2 S+ 19:48 0:00 grep --color=auto top
topコマンド実行でよくあるエラーと対処法
以下のtopコマンドを実行した際に発生するエラーと対処方法を何個か紹介します。
$ nohup top -b -d 60 -n 30 > /tmp/web_top_result$(date +%Y%m%d_%H%M%S).txt 2>&1 &
ファイルが作成されない
原因
出力先ディレクトリに権限がない場合がある
確認方法
以下のコマンドを実行して読み込み・書き込み権限があるかを確認します。
$ ls -ld /tmp
実行結果
drwx------. 6 root root 4096 Jun 10 20:53 /tmp
コマンドの実行結果のとおり、/tmpはrootユーザのみが読み込み・書き込み・実行権限を持っています。
対処方法
- rootユーザで実行する
/tmpディレクトリはrootユーザのものなので、sudo su -でrootユーザに移って実行すれば問題なくログファイルの出力されます。 - 読み込み・書き込み権限を付与する
$ sudo chmod 755 /tmpこれで他のユーザでも問題なくログ出力ができるようになります。
実行後すぐに終わってしまう
以下のようなコマンドを実行すると実行後すぐに終了してしまいます。
# top -b -d 60 -n 3
原因
-n の回数指定が小さい可能性があります。
今回の場合、60秒ごとに3回実行したら終了するので3分で終了してしまいます。
ログアウトすると停止する
nohup を付け忘れている可能性があります。
NG
# top -b -d 60 -n 30 &
OK
# nohup top -b -d 60 -n 30 &
長時間ログ取得したい場合
例えば、1分毎に8時間分のログを取得したい場合は「8×60」で480回取得すればいいので、-n 30を-n 480に変更して以下のコマンドを実行すれば大丈夫です。
# nohup top -b -d 60 -n 480 > /tmp/web_top_result$(date +%Y%m%d_%H%M%S).txt 2>&1 &
まとめ
今回紹介したコマンドはこちらです。
$ nohup top -b -d 60 -n 30 > /tmp/web_top_result$(date +%Y%m%d_%H%M%S).txt 2>&1 &
この1行で以下を実現できます。
✅ 1分ごとに自動取得
✅ 指定回数で終了
✅ ファイルへ保存
✅ ログアウト後も継続
✅ バックグラウンド実行
障害調査やサーバー負荷分析では、top -b -d -n の組み合わせは非常によく使われます。覚えておくと、シェルスクリプトやcronを作らなくても簡単にリソースログを取得できます。





コメント