Come utenti Linux, spesso lavoriamo con processi di background di Linux a lunga durata, chiamati daemon o servizi. Alcuni esempi comuni di servizi sono Secure Shell (sshd), Network Manager (networkd), Volume Manager (LVM), Cron, e così via.
Molte volte è necessario monitorare i log di questi servizi per risolvere i problemi di sistema. Tuttavia, una delle principali sfide è che questi servizi generano molti log e la maggior parte delle volte passare attraverso questi log rende il processo laborioso, ed è qui che possiamo usare il comando tail.
Il comando tail è un’utilità da riga di comando, simile al comando head che legge un file e stampa le ultime 10 righe (contenuto) di uno o più file in output standard.
In questa guida pratica, impareremo il comando tail. Alla fine di questa guida, gli utenti della riga di comando di Linux saranno in grado di utilizzare il comando tail in modo efficace.
Indice dei Contenuti
Sintassi del comando tail
La sintassi del comando tail è simile a altri comandi Linux:
$ tail [OPTIONS] [FILE-1] [FILE-2] ...
1. Stampare le ultime 10 righe di un file in Linux
Per impostazione predefinita, il comando tail stampa le ultime 10 righe del file specificato come mostrato.
$ 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)
Qui possiamo vedere che il comando sopra mostra le ultime dieci righe dal file /var/log/secure.
2. Stampare le ultime N righe di un file in Linux
Nell’ultimo esempio, il comando stampa le ultime 10 righe del file specificato. Tuttavia, possiamo utilizzare l’opzione -n
che ci consente di limitare il numero di righe da stampare a schermo come mostrato.
$ 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)
In questo esempio, possiamo vedere che ora il comando mostra solo le ultime tre righe invece delle dieci.
3. Ignorare le prime N righe di un file in Linux
Eccoci, possiamo usare il simbolo più (+)
con l’opzione -n
, che ci consente di controllare il punto di inizio dal file dato.
Per capire questo, usiamo il valore +5
per avviare l’output dalla quinta riga:
$ 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. Mostra gli ultimi N caratteri del file
Similmente alle righe, possiamo anche usare il comando per visualizzare gli ultimi N
caratteri del file utilizzando l’opzione -c
come mostrato di seguito:
$ tail -c 7 /var/log/secure (uid=0)
In questo esempio, vediamo che il comando mostra gli ultimi sette caratteri ASCII del file dato.
5. Rimuovi i primi N caratteri del file
Allo stesso modo, possiamo usare il simbolo più (+)
con l’opzione -c
per saltare i primi N
caratteri. Quindi saltiamo la prima riga del file usando il comando seguente:
$ 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
Qui, vediamo che il comando mostra tutte le righe tranne la prima.
6. Mostra il nome del file nell’intestazione
Possiamo istruire il comando tail a visualizzare il nome del file corrente come intestazione di visualizzazione, il che è utile quando si lavora con più file.
Quindi, usiamo l’opzione -v
per abilitare l’intestazione di visualizzazione:
$ 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 <==
rappresenta l’intestazione di visualizzazione.
7. Mostra il Nome del File come Intestazione in File Multipli
Come qualsiasi altro comando di elaborazione file, possiamo anche utilizzare file multipli con il comando tail. In tali casi, l’intestazione di visualizzazione viene utilizzata per separare i contenuti del file.
$ 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)
Nell’output sopra, possiamo vedere l’intestazione di visualizzazione per ogni file.
8. Come Disabilitare l’Intestazione di Visualizzazione in un File
Nell’esempio precedente, abbiamo visto che il comando abilita l’intestazione di visualizzazione durante il lavoro con file multipli. Tuttavia, possiamo sopprimere questo comportamento predefinito utilizzando l’opzione -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)
Qui, possiamo vedere che ora il comando visualizza i contenuti del file uno dopo l’altro senza alcuna intestazione di visualizzazione.
9. Come Monitorare un File per Modifiche
Fino ad ora abbiamo visto che il comando tail esce una volta che elabora il numero necessario di righe o caratteri. Tuttavia, a volte vogliamo visualizzare anche i log appena generati.
In tali casi, possiamo utilizzare l’opzione -f
con il comando, che ci permette di monitorare il file per modifiche in tempo reale.
Per comprendere questo, prima, eseguiamo il comando sottostante nel primo terminale:
$ 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.
Qui possiamo vedere che il comando sta aspettando infinitamente dopo aver visualizzato le ultime dieci righe:
Successivamente, apriamo un’altra terminale e aggiungiamo del testo al file numbers-2.txt:
$ echo "View Logs in Real-Time" >> /var/log/messages
Ora passiamo alla prima terminale per visualizzare il testo appena aggiunto:
$ 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
Qui possiamo vedere che il comando tail mostra il testo appena aggiunto.
Conosci qualche altro esempio migliore del comando tail in Linux? Facci sapere le tue opinioni nei commenti qui sotto.