2010-06-02 2 views
0

Мне нужен простой скрипт оболочки, который запускает программу N раз параллельно и сохраняет каждый отдельный вывод в другой файл. Я сделал старт, который запускает программу параллельно и сохраняет результат, но как я могу сохранить только те результаты, которые отличаются? Также как я могу на самом деле сделать вывод echo DONE!?Скрипт оболочки для тестирования

#!/bin/bash 

N=10 

for((i=1; j<=$N; ++i)); do 
    ./test > output-$N & 
done 
echo DONE! 
+0

Как кто-то указал в теперь удаленном ответе, 'j' должен быть' i'. Также 'output- $ N' будет переписывать один и тот же файл« output-10 »с каждым тестом. Я уверен, что вы хотите 'output- $ i', поэтому у вас есть десять разных выходных файлов. –

ответ

3

Вы хотите использовать ожидания встроенной команды.

ожидание [п ...]

Wait для каждого указанного процесса и возвращает статус завершения. Каждый n может быть идентификатором процесса или спецификацией задания; если задана спецификация задания, ожидаются все процессы в конвейере заданий. Если n не задано, все текущие активные дочерние процессы ждут, а статус возврата равен нулю. Если n указывает несуществующий процесс или задание, статус возврата равен 127. В противном случае статус возврата - это статус выхода для последнего процесса или ожидаемого задания.

Вы можете указать свои рабочие места, как %1, %2 ...:

wait %1 %2 %3 ... 

, но до тех пор, как у вас нет других дочерних процессов, вы можете просто использовать его без аргументов; он будет затем ждать все дочерние процессы, чтобы закончить:

for ...; do 
    ... 
done 
wait 
echo "All done!" 

Ваш отдельный вопрос, как сохранить только разные выходы, немного сложнее. Что именно вы имеете в виду - отличное от чего? Если у вас есть базовый уровень, вы можете сделать это:

for ...; do 
    if diff -q $this_output $base_output; then 
     # files are identical 
     rm $this_output 
    fi 
done 

Если вы хотите сохранить все уникальные выходы, алгоритм немного более сложным, конечно, но вы можете все еще использовать diff -q для проверки идентичных выхода.

2

Для того, чтобы иметь свой вывод показывает, что завершены все процессы, вам нужно позвонить wait:

#!/bin/bash 
N=10 

for((i=1; j<=$N; ++i)); do 
    ./test > output-$N & 
done 
wait # wait until all jobs are finished 
echo DONE! 
Смежные вопросы