Linuxでtailコマンドを使用する方法とその例
Linuxユーザーとして、私たちはしばしば長時間実行されるバックグラウンドLinuxプロセス、つまりデーモンやサービスと呼ばれるものを扱います。サービスの一般的な例としては、Secure Shell(sshd)、Network Manager(networkd)、Volume Manager(LVM)、Cronなどがあります。
多くの場合、システムの問題をデバッグするために、これらのサービスのログを監視する必要があります。しかし、主な課題の一つは、これらのサービスが大量のログを生成し、ほとんどの場合、それらのログを確認するのが煩雑になることです。ここでtailコマンドを使用することができます。
tailコマンドは、ファイルを読み込んで1つまたは複数のファイルの最後の10行(内容)を標準出力に印刷する、headコマンドに似たコマンドラインユーティリティです。
この実用ガイドでは、tailコマンドについて学びます。このガイドの終わりまでに、Linuxコマンドラインユーザーはtailコマンドを効果的に使用できるようになります。
tailコマンドの構文
tail コマンドの構文は、他のLinuxコマンドに似ています:
$ tail [OPTIONS] [FILE-1] [FILE-2] ...
1. Linuxでファイルの最後の10行を印刷する
デフォルトでは、tail コマンドは、指定されたファイルの最後の 10 行を以下のように表示します。
$ tail /var/log/secure
Apr 2 14:17:24 TecMint sshd[201178]: Disconnected from user tecmint 192.168.0.162 port 59774
Apr 2 14:17:24 TecMint sshd[201165]: pam_unix(sshd:session): session closed for user tecmint
Apr 2 14:29:12 TecMint sshd[201366]: Accepted password for tecmint from 192.168.0.162 port 56378 ssh2
Apr 2 14:29:12 TecMint systemd[201371]: pam_unix(systemd-user:session): session opened for user tecmint(uid=1002) by (uid=0)
Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session opened for user tecmint(uid=1002) by (uid=0)
Apr 2 14:29:12 TecMint sshd[201382]: Received disconnect from 192.168.0.162 port 56378:11: disconnected by user
Apr 2 14:29:12 TecMint sshd[201382]: Disconnected from user tecmint 192.168.0.162 port 56378
Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
ここでは、上記のコマンドが/var/log/secureファイルの最後の10行を表示していることがわかります。
2. Linuxでファイルの最後のN行を印刷する
最後の例では、コマンドは指定されたファイルの最後の 10 行を出力します。ただし、示されているように、画面に印刷される行数を制限できる-nオプションを使用できます。
$ tail -n 3 /var/log/secure
Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
この例では、コマンドが10行の代わりに最後の3行だけを表示するようになったことがわかります。
3. Linuxでファイルの最初のN行を無視する
ここでは、指定されたファイルからの開始ポイントを制御できる -n オプションとともに、プラス (+) シンボルを使用できます。
これを理解するために、+5の値を使って出力を5行目から始めましょう。
$ tail -n +5 /var/log/secure
Apr 2 14:17:24 TecMint sshd[201178]: Disconnected from user tecmint 192.168.0.162 port 59774
Apr 2 14:17:24 TecMint sshd[201165]: pam_unix(sshd:session): session closed for user tecmint
Apr 2 14:29:12 TecMint sshd[201366]: Accepted password for tecmint from 192.168.0.162 port 56378 ssh2
Apr 2 14:29:12 TecMint systemd[201371]: pam_unix(systemd-user:session): session opened for user tecmint(uid=1002) by (uid=0)
Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session opened for user tecmint(uid=1002) by (uid=0)
Apr 2 14:29:12 TecMint sshd[201382]: Received disconnect from 192.168.0.162 port 56378:11: disconnected by user
Apr 2 14:29:12 TecMint sshd[201382]: Disconnected from user tecmint 192.168.0.162 port 56378
Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
4. ファイルの最後のN文字を表示する
行と同様に、次のように -c オプションを使用してファイルの最後の N 文字を表示するコマンドも使用できます:
$ tail -c 7 /var/log/secure
(uid=0)
この例では、コマンドが指定されたファイルの最後の7つのASCII文字を表示することがわかります。
5. ファイルの最初のN文字を削除する
同様に、(+) シンボルを -c オプションと一緒に使用して、最初の N 文字をスキップすることができます。では、次のコマンドを使用してファイルの最初の行をスキップしましょう:
$ tail -c +5 /var/log/secure
Apr 2 03:02:59 TecMint sudo[162801]: root : TTY=pts/2 ; PWD=/root ; USER=root ; COMMAND=/bin/dnf install R
Apr 2 03:02:59 TecMint sudo[162801]: pam_unix(sudo:session): session opened for user root(uid=0) by root(uid=0)
Apr 2 03:03:02 TecMint sudo[162801]: pam_unix(sudo:session): session closed for user root
Apr 2 03:11:17 TecMint groupadd[163602]: group added to /etc/group: name=avahi, GID=70
Apr 2 03:11:18 TecMint groupadd[163602]: group added to /etc/gshadow: name=avahi
Apr 2 03:11:18 TecMint groupadd[163602]: new group: name=avahi, GID=70
Apr 2 03:11:19 TecMint useradd[163610]: new user: name=avahi, UID=70, GID=70, home=/var/run/avahi-daemon, shell=/sbin/nologin, from=none
Apr 2 03:13:41 TecMint groupadd[163704]: group added to /etc/group: name=colord, GID=986
Apr 2 03:13:41 TecMint groupadd[163704]: group added to /etc/gshadow: name=colord
ここでは、このコマンドが最初の行を除くすべての行を表示することがわかります。
6. ヘッダーにファイル名を表示する
私たちは、tailコマンドに現在のファイル名を表示ヘッダーとして表示するように指示でき、複数のファイルで作業しているときに便利です。
では、-vオプションを使用して表示ヘッダーを有効にしましょう:
$ tail -n 3 -v /var/log/secure
==>/var/log/secure <==
Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
上記の出力において、==> /var/log/secure <== は表示ヘッダーを表しています。
7. 複数のファイルでファイル名をヘッダーとして表示する
他のファイル処理コマンドと同様に、tail コマンドでも複数のファイルを使用することができます。このような場合、表示ヘッダーがファイルの内容を区切るために使用されます。
$ tail -n 3 -v /var/log/secure /var/log/secure-20230402
==> /var/log/secure <==
Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
==> /var/log/secure-20230402 <==
Mar 31 03:50:53 TecMint groupadd[156163]: new group: name=docker, GID=987
Mar 31 04:46:11 TecMint sshd[159403]: Accepted password for root from 192.168.0.162 port 46480 ssh2
Mar 31 04:46:11 TecMint sshd[159403]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
上記の出力では、各ファイルの表示ヘッダーを見ることができます。
8. ファイルの表示ヘッダーを無効にする方法
前の例では、このコマンドが複数のファイルで作業する際にヘッダーの表示を有効にすることを示しました。しかし、-qオプションを使用することで、このデフォルトの動作を抑制することができます。
$ tail -q -n 3 /var/log/secure /var/log/secure-20230402
Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
Mar 31 03:50:53 TecMint groupadd[156163]: new group: name=docker, GID=987
Mar 31 04:46:11 TecMint sshd[159403]: Accepted password for root from 192.168.0.162 port 46480 ssh2
Mar 31 04:46:11 TecMint sshd[159403]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
ここでは、コマンドがヘッダーなしでファイルの内容を順番に表示していることがわかります。
9. ファイルの変更を監視する方法
これまで、tailコマンドは必要な行数または文字数を処理した後に終了することを見てきました。しかし、時には新たに生成されたログも表示したいことがあります。
そのような場合は、コマンドに -f オプションを使用することで、ファイルの変更をリアルタイムで監視することができます。
これを理解するために、まず、最初のターミナルで以下のコマンドを実行しましょう:
$ tail -f /var/log/messages
Apr 2 15:13:28 TecMint NetworkManager[741]: [1680462808.8441] policy: set-hostname: current hostname was changed outside NetworkManager: 'TecMint'
Apr 2 15:13:28 TecMint systemd[1]: Starting Network Manager Script Dispatcher Service...
Apr 2 15:13:28 TecMint systemd[1]: Started Network Manager Script Dispatcher Service.
Apr 2 15:13:37 TecMint arpwatch[11001]: rename arp.dat -> arp.dat-: Operation not permitted
Apr 2 15:13:38 TecMint systemd[1]: NetworkManager-dispatcher.service: Deactivated successfully.
Apr 2 15:13:58 TecMint systemd[1]: systemd-hostnamed.service: Deactivated successfully.
Apr 2 15:18:03 TecMint systemd[1]: Starting dnf makecache...
Apr 2 15:18:03 TecMint dnf[202235]: Metadata cache refreshed recently.
Apr 2 15:18:03 TecMint systemd[1]: dnf-makecache.service: Deactivated successfully.
Apr 2 15:18:03 TecMint systemd[1]: Finished dnf makecache.
ここでは、最後の10行を表示した後にコマンドが無限に待機していることがわかります。
次に、別のターミナルを開き、numbers-2.txt ファイルにいくつかのテキストを追加しましょう:
$ echo "View Logs in Real-Time" >> /var/log/messages
では、最初のターミナルに切り替えて、新しく追加されたテキストを表示しましょう:
$ tail -f /var/log/messages
Apr 2 15:13:28 TecMint NetworkManager[741]: [1680462808.8441] policy: set-hostname: current hostname was changed outside NetworkManager: 'TecMint'
Apr 2 15:13:28 TecMint systemd[1]: Starting Network Manager Script Dispatcher Service...
Apr 2 15:13:28 TecMint systemd[1]: Started Network Manager Script Dispatcher Service.
Apr 2 15:13:37 TecMint arpwatch[11001]: rename arp.dat -> arp.dat-: Operation not permitted
Apr 2 15:13:38 TecMint systemd[1]: NetworkManager-dispatcher.service: Deactivated successfully.
Apr 2 15:13:58 TecMint systemd[1]: systemd-hostnamed.service: Deactivated successfully.
Apr 2 15:18:03 TecMint systemd[1]: Starting dnf makecache...
Apr 2 15:18:03 TecMint dnf[202235]: Metadata cache refreshed recently.
Apr 2 15:18:03 TecMint systemd[1]: dnf-makecache.service: Deactivated successfully.
Apr 2 15:18:03 TecMint systemd[1]: Finished dnf makecache.
View Logs in Real-Time
ここでは、tailコマンドが新しく追加されたテキストを表示することがわかります。
Linuxのtailコマンドの他のベストな例を知っていますか?下のコメントであなたの意見を教えてください。