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"
doneQui:
-c 1invia un solo pacchetto ICMP;-W 1attende al massimo 1 secondo per la risposta;> /dev/nullnasconde 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
doneQuesta 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.txtlegge la lista dal file;-n 1passa un host per volta;-P 4esegue 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.shQuesto 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.comSe 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.8Per 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"
doneQuesta 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.txtIl 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
doneLe 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.comPer SSH:
nc -zv example.com 22Quindi 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
paralleloxargs -Pper 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.
Commenti (0)
Nessun commento ancora.
Segnala contenuto
Elimina commento
Eliminare definitivamente questo commento?
L'azione non si può annullare.