バックグラウンド Linux プロセスを長時間実行する Linux ユーザーとして、デーモンまたはサービスと呼ばれるものとよく作業します。サービスの一般的な例には、Secure Shell(sshd)、Network Manager(networkd)、Volume Manager(LVM)、Cronなどがあります。
これらのサービスのログを監視してシステムの問題をデバッグする必要があることがよくあります。しかし、その主な課題の1つは、これらのサービスが大量のログを生成し、それらのログを閲覧することが煩雑になることです。ここで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 ファイルから最後の十行を表示しているのがわかります。
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)
この例では、コマンドが十行ではなく、今では最後の三行のみを表示しているのがわかります。
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コマンドの他の最良の例を知っていますか?コメントでご意見をお聞かせください。