2010-10-19 9 views
2

Je suis nouveau sur Linux et j'ai été récemment présenté au "&". Je dois courir plusieurs traceroutes et les stocker dans un seul fichier, et je suis curieux si je suis capable de lancer ces traceroutes en parallèle?Résultats de processus parallèles écrits dans un seul fichier

J'ai essayé ce qui suit mais les résultats dans le fichier généré, ne sont pas séparés? Eh bien, c'est ce qu'il me semble.

traceroute -n -z 100 www.yahoo.com >> theLog.log & 
traceroute -n -z 100 www.abc.com >> theLog.log & 

Est ce que je demande même possible de faire? Si oui, quelles commandes devrais-je utiliser?

Merci pour toute direction donnée.

Répondre

0

Avec la commande suivante, ils ne sont pas vraiment en parallèle, mais vous pouvez continuer à utiliser votre terminal, et les résultats sont démontées:

{ traceroute -n -z 100 www.yahoo.com; traceroute -n -z 100 www.abc.com; } >> theLog.log & 
+0

Merci beaucoup. Sur mon système, j'ai dû utiliser "()" au lieu de "{}". – PED

1

Peut-être que vous pourriez enquêter sur parallel (et nous faire part de votre expérience) ? Si vous êtes sur Ubuntu, vous pouvez faire sudo apt-get install moreutils pour obtenir parallel.

+0

C'est marrant que ça ne soit pas venu dans ma recherche. Oui, j'utilise Ubuntu et je n'ai rencontré que les "xargs". Après avoir regardé cette commande, cela semblait être une impasse. – PED

+0

@PED: 'parallel' promet de faire exactement ce que vous avez demandé. Exemple de README: 'parallel traceroute ::: foss.org.my gnu.org freenetproject.org'. Voir l'option '--group' (activée par défaut) http://savannah.gnu.org/projects/parallel – jfs

+0

' xargs' est utilisé pour construire des listes d'arguments et les fournir aux commandes. – rmk

0

Comme vous l'avez écrit, le comportement est indéfini. Vous pourriez essayer ce qu'enzotib posté, ou essayer d'avoir chacun écrire dans leur propre fichier et les chat ensemble à la fin.

1

Si vous voulez que le programme s'exécute en parallèle, mieux vaut conserver les résultats intermédiaires dans des fichiers séparés et les joindre à la fin. Les étapes seraient de commencer chaque trace à son fichier journal et de stocker leurs pid, attendez tous d'arrêter, de les rejoindre les résultats, quelque chose comme ce qui suit:

traceroute -n -z 100 www.yahoo.com > theLog.1.log & PID1=$! 
traceroute -n -z 100 www.abc.com > theLog.2.log & PID2=$!  
wait $PDI1 $PDI2  
cat theLog.1.log theLog.2.log > theLog.log 
rm theLog.2.log theLog.1.log 
0

traceroute s dans la @enzotib's answer sont exécutées une à une heure en séquence.

Vous pouvez exécuter traceroute s en parallèle en utilisant l'option @rmkparallel utility.

$ /usr/bin/time parallel traceroute -n -z 100 <hosts.txt >> parallel.log 
24.78user 0.63system 1:24.04elapsed 30%CPU (0avgtext+0avgdata 37456maxresident)k 
72inputs+72outputs (2major+28776minor)pagefaults 0swaps 

analogique séquentielle est 5 fois plus lent:

$ /usr/bin/time ./sequential.sh 
24.63user 0.51system 7:19.09elapsed 5%CPU (0avgtext+0avgdata 5296maxresident)k 
112inputs+568outputs (1major+8759minor)pagefaults 0swaps 

sequential.sh est:

#!/bin/bash 
(while read host; do traceroute -n -z 100 $host; done;) <hosts.txt >>sequential.log 

Et hosts.txt est:

www.yahoo.com 
www.abc.com 
www.google.com 
stackoverflow.com 
facebook.com 
youtube.com 
live.com 
baidu.com 
wikipedia.org 
blogspot.com 
qq.com 
twitter.com 
msn.com 
yahoo.co.jp 
taobao.com 
google.co.in 
sina.com.cn 
amazon.com 
google.de 
google.com.hk