Como usuários do Linux, frequentemente lidamos com processos de fundo do Linux em execução prolongada, que são chamados de daemons ou serviços. Alguns exemplos comuns dos serviços são Secure Shell (sshd), Gerenciador de Rede (networkd), Gerenciador de Volume (LVM), Cron, e a lista continua.
Muitas vezes precisamos monitorar os logs desses serviços para depurar problemas no 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 trabalhoso, é aqui que podemos usar o comando tail.
O comando tail é uma utilidade 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 poderão 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 Últimas 10 Linhas do Arquivo no Linux
Por padrão, o comando tail imprime as últimas 10 linhas do arquivo fornecido, como 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 Últimas N Linhas do 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, como 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.
3. Ignorar as Primeiras N Linhas de um Arquivo no Linux
Aqui, podemos usar o símbolo de adição (+) 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 começar a saída da 5ª 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 adição (+) 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 a 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)
==> /var/log/secure <==
representa o cabeçalho de exibição.
7. Mostrar o Nome do Arquivo como Cabeçalho em Múltiplos Arquivos
Assim como qualquer outro comando de processamento de arquivo, também podemos usar múltiplos arquivos com o comando tail. Nestes casos, o cabeçalho de exibição é utilizado para separar o conteúdo dos arquivos.
$ 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 em um Arquivo
No exemplo anterior, vimos que o comando habilita o cabeçalho de exibição ao trabalhar com múltiplos 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 Monitorar 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 visualizar os logs recém-gerados também.
Nesses casos, podemos usar a opção -f
com o comando, que nos permite monitorar o arquivo em tempo real por mudanças.
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 acrescente algum texto ao arquivo numbers-2.txt:
$ echo "View Logs in Real-Time" >> /var/log/messages
Agora, vamos voltar para o primeiro terminal para visualizar 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.