Linux / Comando watch: ripetere comandi e osservare le modifiche

watch è un comando che esegue ripetutamente un comando specificato a intervalli regolari e aggiorna l'intero schermo del terminale con i risultati. L'intervallo di esecuzione predefinito è di 2 secondi, e puoi cambiare l'intervallo con -n ed evidenziare le parti che sono cambiate rispetto ai risultati precedenti con -d.

È utile quando si osservano valori che cambiano continuamente, come memoria, disco, processo o stato della rete, in un breve periodo di tempo. Per uscire, di solito si utilizza q o Ctrl+c.

Cos'è il comando watch?

watch fa parte di procps-ng: riesegue un comando e mostra il suo standard output e standard error, cioè risultati e messaggi di errore, aggiornando normalmente la prima schermata del terminale. Non riesegue l’output stesso e non conserva automaticamente una cronologia completa delle esecuzioni.

L’intestazione riporta informazioni sull’intervallo, sul comando e sui tempi di esecuzione; i campi disponibili dipendono dalla versione. L’output che supera le dimensioni del terminale viene tagliato o impaginato secondo le opzioni: per seguire l’intero flusso di un log è in genere preferibile un comando dedicato.

Per opzioni e limiti consulta il manuale di procps-ng watch e la sorgente ufficiale del manuale watch. Gli esempi seguenti si riferiscono a questa implementazione su Linux e richiedono i programmi richiamati; non tutte le versioni o implementazioni hanno le stesse opzioni.

Sintassi e utilizzo di base

watch [opzioni] comando [argomenti del comando...]

Questa è una forma di sintassi, non un comando da copiare letteralmente: sostituisci i segnaposto. Il comando seguente ripete free -h con l’intervallo predefinito di 2 secondi; occorrono un terminale interattivo e free installato. Per interpretare RAM, cache e swap puoi usare la guida italiana a free.

watch free -h

Per eseguire a intervalli di 1 secondo, aggiungi l'opzione -n.

watch -n 1 free -h

L'opzione watch dovrebbe essere posizionata prima del comando da ripetere. Le opzioni scritte dopo il comando vengono normalmente passate al comando ripetuto, non a watch.

Opzioni più usate

Opzione Funzione Uso
-n secondi Specifica l'intervallo di esecuzione Specifica un valore temporale in secondi come watch -n 1 comando.
-d Evidenzia le parti modificate Evidenzia i caratteri che sono cambiati rispetto allo schermo precedente.
-d=permanent Evidenziazione cumulativa delle modifiche Continua a evidenziare tutte le parti che sono cambiate almeno una volta dall'esecuzione iniziale.
-g Esci quando l'output cambia Può essere usato per attendere fino a quando un file o uno stato cambia.
-e Interrompi l'aggiornamento in caso di errore del comando Se il comando ripetuto termina con uno stato diverso da zero, mette in pausa lo schermo ed esce dopo la pressione di un tasto.
-b Segnale acustico in caso di errore del comando Se il comando ripetuto restituisce uno stato diverso da zero, farà suonare il campanello del terminale.
-p Tentativo di intervalli di avvio precisi Esegui secondo l'intervallo specificato basato sull'orario di inizio dell'esecuzione precedente.
-t Nascondi il titolo superiore Assicura un po' più di spazio per mostrare i risultati del comando.
-c Interpreta i colori ANSI Mostra l'output dei colori e stili supportati dal comando ripetuto.
-w Impedisci l'andata a capo delle linee lunghe Mostra le linee che superano la larghezza dello schermo tagliandole invece di andare a capo nella riga successiva.
-x Esegui senza passare attraverso la shell Invece di sh -c, esegui i programmi direttamente senza usare l'espansione della shell e le pipe.

Le opzioni supportate possono variare a seconda della versione di procps-ng inclusa nella distribuzione. Puoi controllare le opzioni disponibili sul tuo sistema attuale con il seguente comando.

watch --help
watch --version

Controllo dell'intervallo e delle modifiche dell'output

Impostare l’intervallo con -n

Specifica un valore in secondi dopo -n o --interval. È anche possibile usare i decimali, ma un intervallo troppo breve può mettere carico inutile sulla CPU, sul disco, sulla rete e sui servizi target.

watch -n 0.5 date
watch -n 5 df -h

Senza -n l’intervallo ordinario è 2 secondi; la variabile WATCH_INTERVAL, se impostata, può cambiare il valore predefinito. La documentazione corrente impone un minimo di 0,1 secondi e un massimo di 2.678.400 secondi, ossia 31 giorni. Controlla la tua versione: questi limiti non rendono consigliabile interrogare un servizio ogni decimo di secondo. Le due righe dell’esempio precedente vanno provate separatamente, uscendo dalla prima esecuzione prima di avviare la seconda.

Evidenziare le modifiche con -d

-d evidenzia le parti che sono cambiate confrontando lo schermo corrente con quello precedente. È comodo quando si visualizzano statistiche di memoria, processi e rete che cambiano rapidamente.

watch -n 1 -d free -h

Per mantenere l’evidenziazione delle posizioni cambiate dalla prima esecuzione puoi usare -d=permanent, se supportato; la forma lunga corrispondente è --differences=permanent. L’argomento opzionale deve restare unito all’opzione. L’evidenziazione riguarda lo schermo, non un registro permanente dei dati.

watch -n 1 -d=permanent free -h

Uscire quando si verificano modifiche con -g

-g o --chgexit termina watch quando cambia l’output visibile. Questo esempio completo crea un file in una nuova directory temporanea e ne mostra il percorso. Lascia aperto il primo terminale e modifica quel file da un secondo terminale, per esempio con un editor; stat -c %Y restituisce il tempo di modifica in secondi, quindi attendi almeno un secondo prima di salvarlo. Al cambiamento del valore visualizzato watch termina; la directory temporanea resta disponibile.

watch_dir=$(mktemp -d) && (
  cd "$watch_dir" || exit
  printf 'iniziale\n' > result.txt
  watch -g -n 1 'printf "File: %s/result.txt\n" "$PWD"; stat -c %Y result.txt'
)

Le modifiche fuori dalla porzione visibile possono non essere rilevate. Anche un messaggio di errore può cambiare l’output e causare l’uscita: -g non certifica che un’attività sia riuscita. Per automatismi affidabili controlla un risultato strutturato o lo stato del comando, considerando la semantica della shell.

Perché sono necessarie le virgolette quando si usano pipe e sintassi della shell

Per impostazione predefinita, watch esegue il comando passato tramite sh -c. Se vuoi usare pipe, reindirizzamenti, punti e virgola, variabili e caratteri jolly come parte del comando ripetuto, è più chiaro racchiudere l'intero comando tra apostrofi singoli.

I comandi semplici vengono passati così come sono

I comandi senza pipe o reindirizzamenti possono essere scritti direttamente in questo modo.

watch -n 2 ls -lh /var/log

Racchiudere pipeline e variabili fra apici

Nell'esempio seguente, le virgolette singole impediscono alla shell corrente di elaborare prima la pipe e passano l'intero comando alla shell che lo eseguirà ripetutamente.

watch -n 1 'ps -eo pid,comm,%cpu,%mem --sort=-%cpu | head -n 15'

Il reindirizzamento o più comandi vengono racchiusi nello stesso modo.

watch -n 5 'date; df -h / /var'

-x passa programma e argomenti direttamente a exec, evitando la shell interna. Non interpreta quindi pipeline, reindirizzamenti o espansioni: per esempio non passare l’intera stringa ls | head come se fosse il nome di un programma. La shell da cui avvii watch può comunque espandere variabili e wildcard prima dell’avvio, se non le proteggi con gli apici. Con l’esecuzione predefinita, inoltre, non presumere che i confini degli argomenti complessi restino intatti nella stringa ricostruita per sh -c.

watch -x -n 2 ls -lh /var/log

Il manuale di GNU Bash, nella sezione Quoting, spiega la protezione di pipe e variabili nella shell di partenza. La shell interna di watch è normalmente sh e può essere diversa da Bash: non usare automaticamente sintassi specifica di Bash dentro la stringa ripetuta.

Esempi pratici di osservazione

Oggetto del controllo Descrizione
Memoria Aggiorna il risultato di free -h ogni secondo ed evidenzia le parti modificate.
Spazio su disco Controlla l'utilizzo dei file system root e /var ogni 5 secondi.
Processi e CPU Ordina i risultati di ps per utilizzo della CPU e mostra le voci principali.
Riepilogo dei socket Controlla ripetutamente lo stato complessivo dei socket di rete con ss -s.
Dimensione dei file Osserva le variazioni nella dimensione dei file scaricati o compressi con stat.
Stato del servizio Esegui ripetutamente systemctl status con --no-pager.

Utilizzo della memoria

watch -n 1 -d free -h

Utilizzo del disco

/ e /var possono appartenere allo stesso filesystem; due righe non indicano necessariamente due volumi distinti. Sostituisci i percorsi con quelli pertinenti.

watch -n 5 'df -h / /var'

Processi con elevato utilizzo della CPU

Richiede ps di procps-ng. %cpu rappresenta una media dall’avvio del processo, non necessariamente l’uso nell’ultimo secondo; head include l’intestazione, quindi 15 righe contengono al massimo 14 processi. Per campioni interattivi usa top o htop. Consulta il manuale di procps-ng ps.

watch -n 1 'ps -eo pid,comm,%cpu,%mem --sort=-%cpu | head -n 15'

Riepilogo dei socket di rete

watch -n 1 ss -s

Dimensione del file e ora di modifica

Prepara un file esistente archive.tar nella directory corrente oppure sostituisci il percorso. stat ne legge dimensione e data senza estrarre o modificare l’archivio; un percorso inesistente produce un errore, non una misura pari a zero.

watch -n 1 'stat -c "%s bytes  %y" archive.tar'

Stato del servizio

watch -n 2 'systemctl --no-pager --full status nginx'

Gli esempi di servizio richiedono systemd e un’unità nginx effettivamente presente: sostituisci il nome con quello corretto. status può restituire uno stato diverso da zero anche per un servizio inattivo; con watch predefinito l’osservazione continua. Per il flusso dei log usa invece journalctl -f -u nginx, nei limiti dei permessi di lettura. Le definizioni sono nel manuale ufficiale di systemctl.

Avvii regolari e comandi lunghi

Normalmente watch attende l’intervallo dopo la fine di un’esecuzione. Con -p o --precise cerca di distanziare gli avvii in base all’inizio precedente. L’esempio aggiunge intenzionalmente un secondo di attesa locale con sleep: permette di confrontare il ritmo degli avvii con e senza -p, su un carico locale controllato.

watch -p -n 10 'date; sleep 1'

Se il comando dura più dell’intervallo, watch attende che finisca e non ne sovrappone un’altra esecuzione. -p non garantisce scadenze in tempo reale né recupero dopo logout o riavvio: per lavori pianificati usa un timer systemd o uno scheduler, configurandone esplicitamente persistenza, errori e limiti.

Controllo con la tastiera

Tasto Azione
q Esce da watch. Il comando figlio in esecuzione potrebbe non fermarsi immediatamente.
Ctrl+c Interrompe watch tramite il segnale del terminale. Non equivale a una chiusura controllata dell’applicazione; verifica eventuali processi o attività rimasti.
Spazio Richiede l'esecuzione del comando senza attendere il prossimo orario programmato. Se è già in esecuzione, avvia la successiva esecuzione immediatamente dopo il completamento senza ritardi.

Le azioni dei tasti possono variare a seconda della versione di procps-ng, quindi controlla prima man watch del sistema attuale.

Precauzioni nell'utilizzo di watch

  • È preferibile utilizzare comandi di sola lettura: Ripetere comandi che modificano lo stato, come eliminazione, pagamento, creazione utente o riavvio del servizio, può portare a risultati indesiderati.
  • Evitare intervalli molto brevi: Eseguire query al database, richieste API remote o ricerche in grandi directory a intervalli molto brevi può gravare sul sistema o sui servizi esterni.
  • Controllare l'intervallo visibile sullo schermo: -g e -d sono influenzati dall'output mostrato nel terminale, quindi le modifiche nell'area troncata potrebbero non essere rilevate.
  • Evita comandi interattivi: Programmi che attendono l'input dell'utente, come richieste di password, editor o pager, non sono adatti per l'esecuzione ripetuta.
  • Distingui lo stato di uscita: Lo stato di successo del comando di base watch non significa sempre che il comando ripetuto sia riuscito. Se devi rispondere agli errori dei comandi, verifica le opzioni come -e nella versione corrente.

Una pipeline eseguita da sh restituisce normalmente lo stato dell’ultimo comando: se ps fallisce ma head termina correttamente, -e può non rilevare il problema del primo comando. Non confondere inoltre lo stato 0 di watch con il successo del comando osservato; con --errexit la versione corrente restituisce invece lo stato del comando che ha provocato l’arresto dopo l’attesa del tasto.

Quando altri strumenti sono più adatti di watch

Scopo Strumenti adatti
Monitoraggio dei log aggiunti a un file tail -f o tail -F
Monitoraggio dei log dei servizi systemd journalctl -f -u nome-servizio
Controllo dell'utilizzo delle risorse del processo top o htop
Attività ripetitive pianificate Timer di systemd o cron
Raccolta di metriche a lungo termine e avvisi Sistema di monitoraggio dedicato

watch è adatto a una persona per osservare i cambiamenti a breve termine sul terminale. Se hai bisogno di conservare registrazioni, notifiche e analisi a lungo termine, dovresti scegliere uno strumento appropriato a tale scopo.

Domande frequenti

Il comando watch non è installato: come procedere?

watch è solitamente incluso nel pacchetto procps o procps-ng. Potrebbe non essere presente negli ambienti di installazione minima, quindi è necessario installare il pacchetto utilizzando il gestore di pacchetti della distribuzione in uso. Controlla la documentazione della distribuzione per il nome del pacchetto e il comando di installazione.

Alias o funzioni della shell non vengono eseguiti all'interno di watch

Alias e funzioni possono essere definiti solo nella shell interattiva corrente e potrebbero non essere trasferiti nell'ambiente sh -c che watch richiama per impostazione predefinita. Per attività ripetitive, è più facile utilizzare in maniera prevedibile l'eseguibile effettivo, un comando esplicito o uno script shell separato.

I colori dei comandi non vengono visualizzati

Abilita l'interpretazione dei colori ANSI con watch -c e imposta il comando ripetuto per restituire codici colore anche in ambienti non interattivi. A seconda del programma, potrebbe essere necessaria un'opzione separata come --color=always.

Perché i comandi che includono pipe dovrebbero essere racchiusi tra virgolette?

Senza virgolette, la shell corrente potrebbe elaborare prima la pipe, causando il passaggio dell'intero output di watch a un altro comando. Racchiudere l'intera pipeline tra virgolette singole permette a watch di passarla come una singola stringa di comando alla shell che la eseguirà ripetutamente.

Riepilogo

watch è uno strumento di osservazione semplice che visualizza ripetutamente i risultati di un comando con l'intervallo predefinito di 2 secondi. Puoi cambiare l'intervallo con -n, evidenziare le modifiche con -d e uscire quando l'output cambia con -g.

I comandi che includono pipe e reindirizzamenti devono essere racchiusi interamente tra virgolette singole, e dovrebbero essere controllati il carico e gli effetti collaterali dell'esecuzione ripetuta sul sistema. Puoi trovare gli scopi di altri comandi per attività nella guida ai comandi Linux.