51 06/04/2026 07/04/2026 7 min

Come fare ping multipli su Linux

Il comando ping standard lavora su un solo host alla volta. Se devi verificare più IP o più nomi DNS insieme, la strada corretta è automatizzare il ciclo con una shell, xargs, parallel oppure uno script che raccolga i risultati in modo leggibile.

Il punto non è solo “mandare ping in parallelo”: serve anche distinguere host raggiungibili, host lenti, perdita pacchetti e problemi DNS. Per questo conviene scegliere il metodo in base al caso d’uso: controllo rapido, monitoraggio ad hoc, test di rete o diagnostica ripetibile.

Metodo più semplice: ciclo shell

Se hai una lista breve di host, il modo più diretto è usare un ciclo for in bash.

for host in 8.8.8.8 1.1.1.1 google.com; do
  ping -c 1 -W 1 "$host" > /dev/null && echo "$host OK" || echo "$host KO"
done

Qui:

  • -c 1 invia un solo pacchetto ICMP;
  • -W 1 attende al massimo 1 secondo per la risposta;
  • > /dev/null nasconde l’output grezzo del ping;
  • l’operatore && / || stampa lo stato finale.

È una soluzione minimale, utile per test manuali. Se vuoi anche il tempo di risposta, togli il redirect e lascia il risultato completo.

Versione con output leggibile

for host in 8.8.8.8 1.1.1.1 google.com; do
  echo "== $host =="
  ping -c 2 -W 1 "$host"
  echo
 done

Questa variante mostra l’RTT, la perdita pacchetti e l’esito del test per ogni destinazione.

Ping di più host con xargs

Quando la lista è lunga o arriva da un file, xargs è spesso più comodo. Per esempio, se hai un file hosts.txt con un host per riga:

cat hosts.txt | xargs -n 1 -P 4 -I {} sh -c 'ping -c 1 -W 1 "{}" > /dev/null && echo "{} OK" || echo "{} KO"'

Meglio ancora, evita il cat inutile:

xargs -a hosts.txt -n 1 -P 4 -I {} sh -c 'ping -c 1 -W 1 "{}" > /dev/null && echo "{} OK" || echo "{} KO"'

Qui:

  • -a hosts.txt legge la lista dal file;
  • -n 1 passa un host per volta;
  • -P 4 esegue fino a 4 processi in parallelo;
  • -I {} sostituisce il placeholder con l’host corrente.

Se la tua shell o la versione di xargs non gradisce -I con -P, puoi usare un approccio più esplicito con sh -c, come sopra. In ambienti misti è la scelta più robusta.

Ping in parallelo con GNU parallel

Se hai molti host e vuoi output pulito, parallel è spesso la soluzione migliore. Non è installato ovunque, ma quando c’è semplifica parecchio il lavoro.

parallel -a hosts.txt 'ping -c 1 -W 1 {} > /dev/null && echo {} OK || echo {} KO'

Vantaggi principali:

  • parallellismo semplice da controllare;
  • output ordinabile e più leggibile;
  • gestione migliore di elenchi lunghi.

Se vuoi limitare il numero di job simultanei:

parallel -j 10 -a hosts.txt 'ping -c 1 -W 1 {} > /dev/null && echo {} OK || echo {} KO'

Con -j 10 mantieni al massimo dieci ping attivi nello stesso momento.

Script bash pronto all’uso

Se devi ripetere il controllo spesso, conviene uno script che legga host da file e produca un riepilogo. Ecco un esempio semplice:

#!/usr/bin/env bash

file="hosts.txt"

while IFS= read -r host; do
  [ -z "$host" ] && continue
  if ping -c 1 -W 1 "$host" > /dev/null 2>&1; then
    echo "$host OK"
  else
    echo "$host KO"
  fi
done < "$file"

Salvalo ad esempio come multi-ping.sh, rendilo eseguibile e avvialo:

chmod +x multi-ping.sh
./multi-ping.sh

Questo approccio è comodo perché puoi aggiungere facilmente logica extra, ad esempio timestamp, salvataggio su file o timeout diversi per host specifici.

Come gestire host DNS e IP insieme

Puoi pingare sia IP sia nomi host nella stessa lista. Il ping risolve il DNS automaticamente, quindi una riga come example.com funziona allo stesso modo di 8.8.8.8.

Attenzione però: se un host risulta KO, non è detto che sia davvero irraggiungibile. Potrebbe essere:

  • DNS non risolvibile;
  • ICMP bloccato da firewall;
  • rate limiting sugli echo request;
  • problema di routing o di connettività reale.

Se vuoi distinguere DNS e rete, fai prima una risoluzione esplicita:

getent hosts example.com

Se il nome risolve ma il ping fallisce, il problema è più probabilmente ICMP o raggiungibilità. Se non risolve, il collo di bottiglia è il DNS.

Timeout, dimensione pacchetto e numero di tentativi

Quando fai ping multipli, è importante evitare test troppo lunghi. Alcune opzioni utili:

  • -c N: numero di pacchetti;
  • -W N: timeout per risposta;
  • -i N: intervallo tra i pacchetti;
  • -s N: dimensione payload ICMP.

Esempio con test più robusto:

ping -c 3 -W 1 -i 0.2 8.8.8.8

Per un check rapido su molti host, -c 1 è il compromesso migliore. Se invece vuoi avere un minimo di affidabilità, usa 2 o 3 pacchetti e valuta perdita e latenza media.

Rilevare solo host vivi

Se ti interessa sapere quali host rispondono, puoi filtrare l’output. Per esempio:

for host in $(cat hosts.txt); do
  ping -c 1 -W 1 "$host" > /dev/null && echo "$host"
done

Questa forma è semplice, ma non è ideale se i nomi host contengono spazi o caratteri speciali. In quel caso meglio usare il ciclo while read già visto.

Per ottenere solo i reachable e salvarli in un file:

while IFS= read -r host; do
  [ -z "$host" ] && continue
  ping -c 1 -W 1 "$host" > /dev/null && echo "$host"
done < hosts.txt > alive.txt

Il file alive.txt conterrà solo i target che hanno risposto.

Misurare latenza e perdita pacchetti su più host

Se il tuo obiettivo non è solo “su/giù” ma anche performance di rete, conviene raccogliere i numeri del ping. Un formato utile è questo:

for host in 8.8.8.8 1.1.1.1 google.com; do
  echo "== $host =="
  ping -c 4 -W 1 "$host" | tail -n 2
 done

Le ultime due righe del ping mostrano di solito il riepilogo con pacchetti trasmessi, ricevuti, perdita e statistiche RTT. È utile per capire se un host è lento anche se risponde.

Se vuoi una metrica precisa da confrontare nel tempo, usa la latenza media o il packet loss e confronta prima/dopo. In troubleshooting di rete, un aumento di perdita o RTT è spesso più informativo del semplice esito OK/KO.

Quando ping non basta

Ricorda che molti host e firewall bloccano ICMP. In questi casi il ping fallisce anche se il servizio è attivo. Per verificare la raggiungibilità reale di un servizio, spesso è meglio testare la porta applicativa.

Per esempio, per HTTP:

curl -I https://example.com

Per SSH:

nc -zv example.com 22

Quindi il ping multiplo è utile per un primo screening, ma non sostituisce i test sul servizio effettivo.

Esempio completo: file di host e riepilogo finale

Se vuoi uno strumento pratico, ecco un esempio più completo che legge da file, esegue i test in parallelo e mostra un riepilogo semplice:

#!/usr/bin/env bash

file="hosts.txt"
parallelism=4

test_host() {
  local host="$1"
  if ping -c 1 -W 1 "$host" > /dev/null 2>&1; then
    echo "$host OK"
  else
    echo "$host KO"
  fi
}
export -f test_host

parallel -j "$parallelism" test_host :::: "$file"

Se parallel non è disponibile, puoi sostituirlo con xargs o con un loop shell. Il vantaggio di questo approccio è la separazione tra logica di test e lista target.

Consigli pratici per usare ping multipli bene

  • Usa sempre timeout brevi quando devi controllare molti host.
  • Non interpretare il KO del ping come down assoluto: può essere solo ICMP filtrato.
  • Se la lista è lunga, preferisci parallel o xargs -P per ridurre i tempi.
  • Per liste affidabili, usa un file con un host per riga e leggi con while read.
  • Se ti serve diagnostica di rete, confronta ping con DNS, porte TCP e log di sistema.

Regola pratica: ping multiplo utile per screening rapido, ma la verifica finale va sempre fatta sul layer del servizio reale.

In sintesi, su Linux puoi eseguire il ping di più host insieme in diversi modi: ciclo shell per semplicità, xargs per compatibilità, parallel per il lavoro in parallelo più pulito, script bash per riuso. La scelta dipende da quanti host devi testare, da quanto vuoi automatizzare e da quanto ti serve l’output leggibile.

Se vuoi, il passo successivo è trasformare questo in uno script con colori, timestamp e report CSV per monitoraggio rapido da terminale.