2015-03-06 3 views
3

J'ai ceci:Bash: variables capture statistiques intermédiaires de ping sur SIGQUIT à

ping -q xxx.xxx.xxx.xxx & disown; pingpid=$! 
for run in {1..3}; do 
sleep 5 
stats+=$(kill -SIGQUIT $pingpid) 
done 
kill $pingpid 

Donc, fondamentalement, je lance ping en arrière-plan avec -q options (pour montrer que stats), obtenir son PID puis exécuter un for boucle dans laquelle je veux stocker les stats intermédiaires de ping sur chaque kill -SIGQUIT $pingpid dans une variable ... c'est 3 lignes de statistiques, à 5 secondes d'intervalle.

Je peux voir les statistiques intermédiaires imprimées sur stdout mais quand je vérifie la variable $stats, je la trouve vide. J'ai aussi essayé avec la redirection de stderr vers stdout mais je ne peux toujours pas obtenir la variable pour avoir les stats stockées dedans.

+0

Bonne question ... On dirait que tout ce qui est imprimé suite à 'kill -SIGQUIT' n'utilise pas de flux de sortie standard. '>' et '2>' n'effectuent certainement aucune redirection. – arco444

Répondre

2

La sortie que vous essayez de capturer provient du processus ping (sur son erreur standard pour être précis), pas du processus de destruction. Vous devez capturer sa sortie avec une redirection lorsque vous le lancez. Essayez ceci:

stats="" 
{ 
     read pingpid 
     for run in {1..3}; do 
       sleep 5 
       kill -quit $pingpid 
       read line 
       stats+="$line"$'\n' 
     done 
} < <(ping -q xx.xx.xx.xx 2>&1 >/dev/null & echo $!) 

kill $pingpid 
stats=${stats%$'\n'} # Remove the extra newline 
echo "$stats" 

L'ordre de la redirection dans la commande ping, 2>&1 >/dev/null, redirige la sortie standard à /dev/null tandis que l'erreur standard est redirigée vers l'entrée de la boucle.

1

Qu'essayez-vous réellement d'accomplir ici? Il semble que vous deviez exécuter ping avec un délai d'expiration, ou un nombre limité de paquets (revient à la même chose à la fin).

for run in 1 2 3; do 
    ping -c 5 -q 12.34.56.78 | tail -n 2 
done 

La sortie régulière de ping est un peu plus bavard que la seule ligne que vous obtenez lorsque vous envoyez un SIGQUIT, nous avons donc besoin de deux lignes de production. Peut-être souhaitez-vous rediriger vers un simple script Awk pour normaliser la sortie afin de l'adapter à vos besoins, ou peut-être la transformer en un format lisible par une machine.