Como usuários do Linux, frequentemente trabalhamos com processos de fundo do Linux em execução prolongada, chamados de daemons ou serviços. Alguns exemplos comuns dos serviços são Secure Shell (sshd), Network Manager (networkd), Volume Manager (LVM), Cron, e a lista continua.
Muitas vezes precisamos monitorar os logs desses serviços para depurar os problemas do sistema. No entanto, um dos principais desafios é que esses serviços geram muitos logs e na maioria das vezes passar por esses logs torna-se complicado, é aí que podemos usar o comando tail.
O comando tail é um utilitário de linha de comando, semelhante ao comando head que lê um arquivo e imprime as últimas 10 linhas (conteúdo) de um ou mais arquivos na saída padrão.
Neste guia prático, aprenderemos sobre o comando tail. Ao final deste guia, os usuários da linha de comando do Linux serão capazes de usar o comando tail de forma eficaz.
Sumário
Sintaxe do Comando tail
A sintaxe do comando tail é semelhante a outros comandos do Linux:
$ tail [OPTIONS] [FILE-1] [FILE-2] ...
1. Imprimir as Últimas 10 Linhas de um Arquivo no Linux
Por padrão, o comando tail imprime as últimas 10 linhas do arquivo fornecido, conforme mostrado.
$ 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)
Aqui, podemos ver que o comando acima mostra as últimas dez linhas do arquivo /var/log/secure.
2. Imprimir as Últimas N Linhas de um Arquivo no Linux
No último exemplo, o comando imprime as últimas 10 linhas do arquivo fornecido. No entanto, podemos usar a opção -n
que nos permite limitar o número de linhas a serem impressas na tela, conforme mostrado.
$ 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)
Neste exemplo, podemos ver que agora o comando mostra apenas as últimas três linhas em vez das dez linhas.
3. Ignorar as Primeiras N Linhas de um Arquivo no Linux
Aqui, podemos usar o símbolo de mais (+)
com a opção -n
, o que nos permite controlar o ponto de partida a partir do arquivo fornecido.
Para entender isso, vamos usar o valor +5
para iniciar a saída a partir da quinta linha:
$ 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. Mostrar os Últimos N Caracteres do Arquivo
Similar às linhas, também podemos usar o comando para exibir os últimos N
caracteres do arquivo usando a opção -c
conforme mostrado abaixo:
$ tail -c 7 /var/log/secure (uid=0)
Neste exemplo, podemos ver que o comando mostra os últimos sete caracteres ASCII do arquivo fornecido.
5. Remover os Primeiros N Caracteres do Arquivo
Da mesma forma, podemos usar o símbolo de mais (+)
com a opção -c
para pular o primeiro caractere N
. Então, vamos pular a primeira linha do arquivo usando o comando abaixo:
$ 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
Aqui, podemos ver que o comando mostra todas as linhas exceto a primeira linha.
6. Mostrar o Nome do Arquivo no Cabeçalho
Podemos instruir o comando tail para exibir o nome do arquivo atual como um cabeçalho de exibição, o que é útil ao trabalhar com vários arquivos.
Então, vamos usar a opção -v
para habilitar o cabeçalho de exibição:
$ 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)
7. Mostrar o Nome do Arquivo como Cabeçalho em Múltiplos Arquivos
Assim como qualquer outro comando de processamento de arquivos, também podemos usar vários arquivos com o comando tail. Nesses casos, o cabeçalho de exibição é usado para separar o conteúdo do arquivo.
$ 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)
No exemplo acima, podemos ver o cabeçalho de exibição para cada arquivo.
8. Como Desativar o Cabeçalho de Exibição no Arquivo
No exemplo anterior, vimos que o comando habilita o cabeçalho de exibição ao trabalhar com vários arquivos. No entanto, podemos suprimir esse comportamento padrão usando a opção -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)
Aqui, podemos ver que agora o comando exibe o conteúdo do arquivo um após o outro sem nenhum cabeçalho de exibição.
9. Como Observar um Arquivo para Mudanças
Até agora vimos que o comando tail sai uma vez que processa o número necessário de linhas ou caracteres. No entanto, às vezes queremos ver os logs recém-gerados também.
Nesses casos, podemos usar a opção -f
com o comando, o que nos permite monitorar o arquivo em busca de mudanças em tempo real.
Para entender isso, primeiro, vamos executar o comando abaixo no primeiro terminal:
$ 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.
Aqui, podemos ver que o comando está esperando infinitamente após exibir as últimas dez linhas:
Em seguida, abra outro terminal e adicione algum texto ao arquivo numbers-2.txt:
$ echo "View Logs in Real-Time" >> /var/log/messages
Agora, vamos mudar para o primeiro terminal para ver o texto recém-adicionado:
$ 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
Aqui, podemos ver que o comando tail mostra o texto recém-adicionado.
Você conhece algum outro melhor exemplo do comando tail no Linux? Deixe-nos saber suas opiniões nos comentários abaixo.