「tail コマンドでファイルの末尾を表示できるのは知っているけど、オプションの使い分けが曖昧」
Linuxサーバーの運用保守で、ログファイルをリアルタイムに監視する場面は毎日のように訪れます。
この記事では、Linuxの
tail コマンドの基本的な使い方から、実務で最も重要な tail -f によるリアルタイム監視、grep との組み合わせによる特定ログの抽出、ログローテーションに対応する -F オプション(大文字)の使い分け、nohup を使ったバックグラウンド長時間監視、さらに journalctl -f との使い分けまでを解説します。RHEL 9 / AlmaLinux 9 / Ubuntu 24.04 LTS で動作確認済みです。この記事のポイント
・tail -f はログをリアルタイム監視する運用保守の基本コマンド
・ログローテーションに対応するには -F(大文字)を使うのが鉄則
・grep や journalctl と組み合わせれば、必要な情報だけを絞り込める
・nohup で tail -F をバックグラウンド実行すれば、ターミナルを閉じても長時間監視が継続できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
tailコマンドとは?ファイル末尾を表示する基本コマンド
tail コマンドは、ファイルの末尾(最後の部分)を表示するコマンドです。対になるコマンドとして、ファイルの先頭を表示する head があります。ログファイルは時系列で追記されていくため、最新の情報は必ずファイルの末尾に存在します。「直前に何が起きたか」を素早く確認したいときは、まず
tail コマンドが最初の選択肢になります。オプションを何も付けずに実行すると、デフォルトで末尾10行が表示されます。
# 基本書式 # tail [オプション] ファイル名 # /var/log/messages の末尾10行を表示する # tail /var/log/messages # 末尾30行を表示する # tail -n 30 /var/log/messages
1. 実際のサーバーでの実行例
本番サーバーでtail を実行すると、次のような出力が得られます。# tail -n 5 /var/log/messages May 28 09:10:32 web01 kernel: EXT4-fs (sda1): mounted filesystem May 28 09:10:34 web01 systemd[1]: Started OpenSSH Server Daemon. May 28 09:10:35 web01 sshd[1234]: Server listening on 0.0.0.0 port 22. May 28 09:15:02 web01 sshd[2341]: Accepted publickey for ec2-user May 28 09:20:01 web01 CROND[3012]: (root) CMD (/usr/lib64/sa/sa1 1 1)
行数・バイト数を指定して表示する
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 # ヘッダー行(1行目)をスキップして2行目以降を表示する # tail -n +2 /tmp/access.csv
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 を押してください。実際の監視中の出力はこのようになります。プロンプトが戻らず画面が待機状態になっていれば、正常に監視中です。
# tail -f /var/log/messages May 28 09:30:01 web01 systemd[1]: Starting Session 42 of User ec2-user. May 28 09:30:01 web01 CROND[5201]: (root) CMD (/usr/lib64/sa/sa1 1 1) May 28 09:30:02 web01 systemd[1]: Started Session 42 of User ec2-user. May 28 09:35:01 web01 CROND[5302]: (root) CMD (/usr/lib64/sa/sa1 1 1) ← ここで待機中(新しい行が書き込まれると自動で表示される)
3. よく監視対象になるログファイル一覧
現場でよくtail -f の対象になるログファイルをまとめます。| ログファイル | 用途 |
|---|---|
| /var/log/messages | システム全般のイベントログ(RHEL/CentOS 系) |
| /var/log/syslog | システム全般のイベントログ(Ubuntu/Debian 系) |
| /var/log/secure | SSH ログイン・認証ログ(RHEL/CentOS 系) |
| /var/log/auth.log | SSH ログイン・認証ログ(Ubuntu/Debian 系) |
| /var/log/httpd/error_log | Apache のエラーログ |
| /var/log/httpd/access_log | Apache のアクセスログ |
| /var/log/nginx/error.log | Nginx のエラーログ |
| /var/log/cron | cron の実行ログ |
| /var/log/maillog | メール送受信ログ(Postfix 等) |
4. 行数を指定してから監視を開始する
-n と -f を組み合わせると、「直近の指定行数を表示してからリアルタイム監視に入る」という動作になります。# 直近50行を表示してから監視を開始する # tail -n 50 -f /var/log/messages # 直近0行(=過去の表示なし)で、新規追記分だけを監視する # tail -n 0 -f /var/log/messages
-n 0 -f を使うのが現場の定番です。5. 複数ファイルを同時に監視する
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" # 特定のキーワードを除外して監視する(CRONのログは邪魔なので除外) # tail -f /var/log/messages | grep -v "CRON"
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 # --follow=name と --retry を組み合わせた確実な追跡 # tail --follow=name --retry /var/log/messages
-F は --follow=name --retry と同等の動作です。ファイルが一時的に存在しなくなってもリトライしてくれます。-f(小文字)と -F(大文字)の違いを表にまとめます。| オプション | 追跡方式 | logrotate 後の動作 |
|---|---|---|
| -f(小文字) | ファイルディスクリプタで追跡 | 古いファイルを追い続ける(監視が止まる) |
| -F(大文字) | ファイル名で追跡(定期的に再オープン) | 新しいファイルを自動で追い直す |
| --follow=name | -F と同等(ファイル名で追跡) | 新しいファイルを自動で追い直す |
| --retry | ファイルが存在しないときも待機 | ファイルが消えても再作成を待つ |
-f ではなく -F を使うのが鉄則です。実際に
-F がどう動くかを確認します。logrotate が実行されると次のメッセージが表示され、自動で新しいファイルへ切り替わります。# tail -F /var/log/messages May 28 10:00:01 web01 CROND[6100]: (root) CMD (...) (logrotate が実行) tail: '/var/log/messages' has been replaced; following new file May 28 10:00:05 web01 rsyslog[850]: imuxsock: Acquired UNIX socket... (新しいファイルの監視を自動で再開)
headコマンドとの使い分け
tail がファイルの末尾を表示するのに対し、head はファイルの先頭を表示します。・tail:ログファイルの最新部分を確認する(末尾が最新)
・head:設定ファイルの冒頭コメントやヘッダー行を確認する
# ファイルの先頭10行を表示する # head /etc/httpd/conf/httpd.conf # ファイルの先頭20行を表示する # head -n 20 /etc/httpd/conf/httpd.conf
6. パイプと組み合わせる
他のコマンドの出力結果をパイプで受け取り、末尾だけ(または先頭だけ)を表示するのも日常的な使い方です。# プロセス一覧から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
tail と journalctl の使い分けをまとめます。| 状況 | 使うコマンド |
|---|---|
| /var/log/ 配下のテキストログを監視 | tail -F ファイルパス |
| systemd ユニット(sshd・httpd 等)のログ | journalctl -u sshd -f |
| カーネルメッセージをリアルタイム監視 | dmesg -w または journalctl -k -f |
| 全 systemd ログをリアルタイム監視 | journalctl -f |
tail -f で、systemctlで管理しているサービスの動作ログは journalctl -f で監視する、という使い分けになります。実務で使えるtailの応用パターン
7. 複数キーワードで絞り込む
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"
8. タイムスタンプ付きで監視結果をファイルに保存する
障害対応中、後からログを振り返るために監視結果をファイルに残しておきたい場合は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
9. エラー検知でアラートを出すスクリプト
tail -F をスクリプトに組み込むことで、特定のログパターンを検知したタイミングでアクションを実行できます。障害対応の初動を自動化したい場合に活用してください。#!/bin/bash # エラー行を検知したらターミナルにアラートを出す # 使い方: bash watch-error.sh /var/log/httpd/error_log LOG_FILE="${1:-/var/log/messages}" PATTERN="error|critical|fatal" echo "[監視開始] ${LOG_FILE}" tail -F "${LOG_FILE}" | while read -r line; do if echo "${line}" | grep -qiE "${PATTERN}"; then echo "[ALERT] $(date '+%Y-%m-%d %H:%M:%S') ${line}" fi done
10. バックグラウンドでの長時間監視(nohup)
通常のtail -f はターミナルを閉じると停止します。長時間の監視をバックグラウンドで続けたい場合は nohup を使います。# バックグラウンドで tail -F を実行しログファイルへ書き出す # nohup tail -F /var/log/httpd/error_log > /tmp/tail-output.log 2>&1 & # echo $! > /tmp/tail-watch.pid # 後から確認する # tail -f /tmp/tail-output.log # 監視を停止する # kill $(cat /tmp/tail-watch.pid)
screen や tmux でセッションを維持する方法もありますが、単純なバックグラウンド監視であれば nohup が手軽です。tail -f が表示されない場合のトラブルシュート
【トラブル1】Permission denied でログが読めない
# tail -f /var/log/secure tail: cannot open '/var/log/secure' for reading: Permission denied
# root で実行する # sudo tail -f /var/log/secure # 一般ユーザーを adm グループに追加する(RHEL/CentOS 系) # sudo usermod -aG adm ec2-user
「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 ファイル名 |
| N行目から末尾まで全て表示する | tail -n +50 ファイル名 |
| リアルタイムにログを監視する(基本) | tail -f ファイル名 |
| 特定のキーワードだけリアルタイム監視する | tail -f ファイル名 | grep --line-buffered "キーワード" |
| 複数ファイルを同時に監視する | tail -f ファイル1 ファイル2 |
| ログローテーションに追従して監視する(推奨) | tail -F ファイル名 |
| ファイルが消えても待機して追跡する | tail --follow=name --retry ファイル名 |
| バックグラウンドで長時間監視する | nohup tail -F ファイル名 > 出力ファイル & |
| systemdサービスのログを監視する | journalctl -u サービス名 -f |
| ファイルの先頭を表示する | head ファイル名 |
ログ監視を自信を持ってこなせるようになりたい方へ
tail -f の使い分けは、障害対応の現場で必ず問われる基本技術です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:sortコマンドでテキストを並び替える方法|数値ソートやフィールド指定も
- 前のページへ:mvコマンドでファイルを移動・リネームする方法|上書き防止や一括変更も
- この記事の属するカテゴリ:Linuxtipsへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます