2010-10-19 3 views
2

Я новичок в Linux и недавно был представлен в «&». Я должен запустить несколько traceroutes и сохранить их в одном файле, и мне любопытно, могу ли я запустить эти трассировки параллельно?Результаты параллельных процессов, написанные для одного файла

Я пробовал следующее, но результаты в сгенерированном файле не сохранились отдельно? Ну, вот что мне кажется.

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

Это то, что я прошу даже можно сделать? Если да, то какие команды я должен использовать?

Спасибо за любое заданное направление.

ответ

0

С помощью следующей команды, они на самом деле не параллельно, но вы можете продолжать использовать ваш терминал, и результаты разобрали:

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

большое спасибо. В моей системе мне пришлось использовать «()» вместо «{}». – PED

1

Может быть, вы могли бы исследовать parallel (и расскажите нам о своем опыте) ? Если вы находитесь на Ubuntu, вы можете сделать sudo apt-get install moreutils, чтобы получить parallel.

+0

Забавно, что это не произошло в моем поиске. Да, я использую Ubuntu и только столкнулся с «xargs». Посмотрев на эту команду, он казался тупиком. – PED

+0

@PED: 'parallel' обещает сделать именно то, что вы просили. Пример из README: 'parallel traceroute ::: foss.org.my gnu.org freenetproject.org'. См. Опцию '--group' (включена по умолчанию). Http://savannah.gnu.org/projects/parallel – jfs

+0

' xargs' используется для создания списков аргументов и подачи их в команды. – rmk

0

Как вы его написали, поведение не определено. Вы можете попробовать, что опубликовали enzotib, или попытаться записать каждый файл в свой собственный файл и скомпоновать их вместе в конце.

1

Если вы хотите, чтобы он работал параллельно, лучше сохранить промежуточные результаты в разделенных файлах, они присоединяются к ним в конце. Эти шаги были бы начать каждый след, чтобы это файл журнала и сохранить их PID, ждать их всех, чтобы остановить, они примыкают к тем результатам, что-то вроде следующего:

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 в @enzotib's answer выполняются по одному время в последовательности.

Вы можете выполнить traceroute s параллельно, используя предложенный @rmk номер parallel 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 

Последовательный аналоговый 5 раз медленнее:

$ /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 является:

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

И hosts.txt является:

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 
Смежные вопросы