Bash "PS" параллельные процессы и проверить, когда они завершены - PullRequest
0 голосов
/ 26 января 2012

Имея большой набор файлов, которые мне нужно просмотреть, я делаю это в скрипте bash, например:

#! /usr/bin/env bash

REX="word"
grep -IP $REX A* >> result &
grep -IP $REX B* >> result &
grep -IP $REX C* >> result &
grep -IP $REX D* >> result &
[..]

Как узнать, когда все процессы завершены?

Ответы [ 4 ]

4 голосов
/ 26 января 2012

Я бы решил решить вашу проблему другим путем. find может найти определенные файлы в вашей файловой системе, а xargs позволяет запускать команды для заданных входных файлов. Поэтому я бы использовал такую ​​команду:

find ./ -type f -print0 | xargs -0 -I{} -n1 -P4 grep -IP $REX '{}' >> result

Это будет поиск, начиная с текущего каталога (./) для всех обычных файлов (-type f), и безопасно передаст их xargs на случай, если в имени файла есть пробелы (-print0) , xargs затем для каждой команды запускается ваша команда grep. -I{} сообщает xargs, что там, где он видит {}, он вставит имя файла в команду. Не обязательно здесь, но хорошая практика. -0 идет рука об руку с -print0 из find и говорит ему ожидать ввода таким образом. -P4 указывает xargs запускать до 4 процессов одновременно, а -n1, как описано в справочной странице, намекает xargs на использование только одного аргумента за раз на команду.

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

4 голосов
/ 26 января 2012

Использование встроенного в bash 'wait'

wait [n ...]

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

В вашем случае должно быть достаточно:

REX="word"
grep -IP $REX A* >> result &
grep -IP $REX B* >> result &
grep -IP $REX C* >> result &
grep -IP $REX D* >> result &

echo "Waiting..."
wait
echo "All child terminated"
1 голос
/ 26 января 2012

Попробуйте проверить, что вывод jobs -p | wc -l равен нулю строк.

К вашему сведению: существуют более эффективные способы параллельной обработки, чем использование оболочки в качестве менеджера заданий. find -print0 до xargs -0 -P - мой личный фаворит.

0 голосов
/ 26 января 2012

используйте ожидание.Я даже не думаю, что вам нужно сохранять и указывать pids в этом случае, например,

    #! /usr/bin/env bash

REX="word"
grep -IP $REX A* >> result &
grep -IP $REX B* >> result &
grep -IP $REX C* >> result &
grep -IP $REX D* >> result &
[..]
wait
echo "done"

Обратите внимание, что есть способы получше, чем перечислять все.Вы можете передать ls в xargs или использовать, например, exec с find.

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