「tail コマンドでファイルの末尾を表示できるのは知っているけど、オプションの使い分けが曖昧」
Linuxサーバーの運用保守で、ログファイルをリアルタイムに監視する場面は毎日のように訪れます。
この記事では、Linuxの
tail コマンドの基本的な使い方から、実務で最も重要な tail -f によるリアルタイム監視、grep との組み合わせによる特定ログの抽出、ログローテーションに対応する -F オプション、さらに journalctl -f との使い分けまでを解説します。tailコマンドとは?ファイル末尾を表示する基本コマンド
tail コマンドは、ファイルの末尾(最後の部分)を表示するコマンドです。対になるコマンドとして、ファイルの先頭を表示する head があります。オプションを何も付けずに実行すると、デフォルトで末尾10行が表示されます。
# 基本書式 # tail ファイル名 # /var/log/messages の末尾10行を表示する # tail /var/log/messages
行数・バイト数を指定して表示する
1. 末尾の行数を指定する(-n)
デフォルトの10行では足りない、あるいは3行だけ見たいという場合は-n オプションで行数を指定します。# 末尾20行を表示する # tail -n 20 /var/log/messages # -n を省略して数字だけでも指定できる # tail -20 /var/log/messages
-n +行番号 と「+(プラス)」を付けると、指定した行番号以降を全て表示できます。# 50行目以降を全て表示する # tail -n +50 /var/log/messages
2. 末尾のバイト数を指定する(-c)
行数ではなくバイト数で指定したい場合は-c オプションを使います。# 末尾500バイトを表示する # tail -c 500 /var/log/messages # 末尾1KB(1024バイト)を表示する # tail -c 1024 /var/log/messages
tail -f でリアルタイムにログを監視する(最重要)
tail コマンドで最も重要なオプションが -f(follow)です。ファイルの末尾を表示した後、コマンドが終了せずに待機し続け、新しい行が書き込まれるたびにリアルタイムで画面に表示します。# /var/log/messages をリアルタイム監視する # tail -f /var/log/messages
監視を終了するには
Ctrl + C を押してください。3. 行数を指定してから監視を開始する
-n と -f を組み合わせると、「直近の指定行数を表示してからリアルタイム監視に入る」という動作になります。# 直近50行を表示してから監視を開始する # tail -n 50 -f /var/log/messages # 直近0行(=過去の表示なし)で、新規追記分だけを監視する # tail -n 0 -f /var/log/messages
-n 0 -f を使うのが現場の定番です。4. 複数ファイルを同時に監視する
tail -f にはファイルを複数指定できます。どのファイルに書き込まれたかがヘッダー付きで表示されるため、関連する複数のログを同時に追いかけるのに便利です。# messages と secure を同時に監視する # tail -f /var/log/messages /var/log/secure ==> /var/log/messages <== Mar 10 10:00:01 server systemd: Started Session 123. ==> /var/log/secure <== Mar 10 10:00:05 server sshd[1234]: Accepted publickey for admin
tail -f と grep を組み合わせてログを絞り込む
tail -f だけでは全てのログが画面に流れてくるため、本番環境のようにログ量が多いサーバーでは肝心の情報が埋もれてしまいます。パイプで
grep に渡すことで、特定のキーワードを含む行だけをリアルタイムに抽出できます。# ERROR を含む行だけをリアルタイム監視する # tail -f /var/log/messages | grep "ERROR" # 大文字・小文字を区別せずに error を抽出する # tail -f /var/log/messages | grep -i "error" # 特定のIPアドレスからのアクセスだけを監視する # tail -f /var/log/httpd/access_log | grep "192.168.1.100"
tail -f | grep のパイプ連携は、サーバー管理者が最も頻繁に使うコマンドの組み合わせの1つです。障害対応中にターミナルを開いて、まずこれを叩くのが現場のセオリーです。【重要】grep に --line-buffered を付ける
tail -f | grep の組み合わせで「ログは出ているはずなのに grep の結果が画面に表示されない」という症状が起きることがあります。これは grep が出力をバッファリング(一定量溜めてから一括出力)しているのが原因です。--line-buffered オプションを付けると、1行ごとに即座に出力されるようになります。# --line-buffered で1行ずつ即時表示する # tail -f /var/log/messages | grep --line-buffered "ERROR"
--line-buffered を付ける癖をつけておくのが安全です。tail -F でログローテーションに対応する
本番サーバーでは logrotate(ログローテーション)によって、ログファイルが定期的に切り替わります。例えば/var/log/messages が /var/log/messages-20260310 にリネームされ、新しい /var/log/messages が作成される、という動作です。tail -f はファイルディスクリプタ(ファイルの内部的な識別情報)を追いかけるため、ログローテーションでファイルが切り替わると、古いファイルを監視し続けてしまいます。新しいファイルへの書き込みは表示されません。-F オプション(大文字のF)はファイル名を追いかけるため、ファイルが入れ替わっても自動的に新しいファイルの監視を再開します。# ログローテーションに追従して監視する(本番環境向け) # tail -F /var/log/messages
-F は --follow=name --retry と同等の動作です。ファイルが一時的に存在しなくなってもリトライしてくれます。本番環境で長時間のログ監視を行う場合は、
-f ではなく -F を使うのが鉄則です。headコマンドとの使い分け
tail がファイルの末尾を表示するのに対し、head はファイルの先頭を表示します。・tail:ログファイルの最新部分を確認する(末尾が最新)
・head:設定ファイルの冒頭コメントやヘッダー行を確認する
# ファイルの先頭10行を表示する # head /etc/httpd/conf/httpd.conf # ファイルの先頭20行を表示する # head -n 20 /etc/httpd/conf/httpd.conf
5. パイプと組み合わせる
他のコマンドの出力結果をパイプで受け取り、末尾だけ(または先頭だけ)を表示するのも日常的な使い方です。# プロセス一覧からCPU使用率の高い上位5つを表示する # ps aux --sort=-%cpu | head -6 # 最近更新されたファイル5つを表示する # ls -lt /var/log/ | head -6 # ディスク使用量の大きいディレクトリ上位10件を表示する # du -sh /var/* | sort -rh | head -10 # 長い出力の末尾5行だけを表示する # dmesg | tail -5
journalctl -f との比較(systemd環境)
RHEL 7 / CentOS 7 以降のsystemd環境では、多くのサービスのログが/var/log/messages などのテキストファイルではなく、systemdのジャーナル(バイナリ形式)に記録されます。この場合、
tail -f の代わりに journalctl -f を使います。# システム全体のログをリアルタイム監視する # journalctl -f # 特定のサービス(例:httpd)のログだけを監視する # journalctl -u httpd -f # 特定の優先度(エラー以上)のログだけを監視する # journalctl -f -p err
/var/log/messages、Apacheのアクセスログなど)を監視する場合に使う・journalctl -f:systemdが管理するサービスのログを監視する場合に使う
実際の運用では、Apacheやnginxのアクセスログのようにテキストファイルとして出力されるログは
tail -f で、systemctlで管理しているサービスの動作ログは journalctl -f で監視する、という使い分けになります。実務で使えるtailの応用パターン
6. 複数キーワードで絞り込む
grep -E(拡張正規表現)を使うと、複数のキーワードのいずれかにマッチする行を抽出できます。# ERROR または WARNING を含む行だけを監視する # tail -f /var/log/messages | grep --line-buffered -E "ERROR|WARNING" # 特定のキーワードを除外して監視する # tail -f /var/log/messages | grep --line-buffered -v "CRON"
7. タイムスタンプ付きで監視結果をファイルに保存する
障害対応中、後からログを振り返るために監視結果をファイルに残しておきたい場合はtee を使います。# 画面に表示しつつ、ファイルにも保存する # tail -f /var/log/messages | tee /tmp/monitor.log # grep で絞り込んだ結果だけを保存する # tail -f /var/log/messages | grep --line-buffered "ERROR" | tee /tmp/error_monitor.log
tail -f が表示されない場合のトラブルシュート
「tail -f でログを監視しているのに何も表示されない」場合
以下の原因を順番に確認してください。・そもそもログが出力されていない:監視対象のサービスが停止していないか、
systemctl status サービス名 で確認する・ログの出力先が違う:サービスによってはデフォルトのログ出力先が
/var/log/messages ではない場合がある。サービスの設定ファイルで実際の出力先を確認する・journalに出力されている:systemd管理のサービスはテキストファイルではなくジャーナルに出力されている可能性がある。
journalctl -u サービス名 -f を試す「tail -f | grep で結果が遅れて表示される」場合
前述の通り、grep のバッファリングが原因です。--line-buffered オプションを付けてください。# バッファリングを無効化して即時表示する # tail -f /var/log/messages | grep --line-buffered "ERROR"
「tail -f でログローテーション後に表示が止まった」場合
-f(小文字)はファイルディスクリプタを追いかけるため、ログローテーションでファイルが切り替わると新しいファイルを認識できません。-F(大文字)に変更してください。# ログローテーション対応版 # tail -F /var/log/messages
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| ファイルの末尾10行を表示する | tail ファイル名 |
| 末尾の行数を指定して表示する | tail -n 20 ファイル名 |
| 末尾のバイト数を指定して表示する | tail -c 500 ファイル名 |
| 指定した行番号以降を全て表示する | tail -n +50 ファイル名 |
| リアルタイムにログを監視する | tail -f ファイル名 |
| 特定のキーワードだけリアルタイム監視する | tail -f ファイル名 | grep --line-buffered "キーワード" |
| 複数ファイルを同時に監視する | tail -f ファイル1 ファイル2 |
| ログローテーションに追従して監視する | tail -F ファイル名 |
| systemdサービスのログを監視する | journalctl -u サービス名 -f |
| ファイルの先頭を表示する | head ファイル名 |
tail -f のログ監視を、自信を持って使いこなせますか?
tailコマンドはログ監視の基本ですが、本番環境ではログローテーション対応やgrep連携など、知っておくべきことが数多くあります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
<<関連記事>>
・pstree
・chsh
・finger
・duコマンドでディスク使用量を確認する方法|ディレクトリごとの容量や容量順ソートも
・LinuxのOSバージョンを確認するコマンド|uname・os-release・hostnamectlの使い方
