Shell скрипт для тестирования - PullRequest
0 голосов
/ 02 июня 2010

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

#!/bin/bash

N=10

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

Ответы [ 3 ]

3 голосов
/ 02 июня 2010

Вы захотите использовать встроенную функцию ожидания.

подождите [n ...]

Дождаться каждого указанного процесса и возвращать его статус завершения. Каждый 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 голосов
/ 02 июня 2010

Чтобы ваш вывод показал, что все процессы завершены, вам нужно вызвать 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!
1 голос
/ 28 июня 2010

С GNU Parallel http://www.gnu.org/software/parallel/ вы можете сделать:

/tmp/test > base; seq 1 10 | parallel -k "/tmp/test >output-{}; if diff -q output-{} base; then rm {}; fi" ; echo DONE

GNU Parallel полезен для других вещей. Посмотрите вступительное видео для GNU Parallel: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...