2016-02-08 5 views
2

Итак, у меня есть ситуация, когда я выполняю многочисленные команды с параллельным подключением вывода к другому сценарию, который потребляет результат. Проблема, с которой я сталкиваюсь, заключается в том, что мой скрипт, выполняющий обработку вывода, должен знать, когда какая-то конкретная команда закончила выполнение.GNU Parallel - обнаружение завершения параллельной команды

Я использую опцию --tag, чтобы я знал, какая команда сгенерировала вывод, но в настоящее время мне нужно подождать, пока параллельная работа будет выполняться всеми командами, прежде чем я смогу узнать, что я больше не собираюсь выводить данные из определенного команда. По моему пониманию параллели я вижу следующие возможные решения, но мне никто не подходит.

  1. Я мог бы сгруппировать выходные линии с --line-buffer вариант так выглядит, что пробежались последовательно. Затем всякий раз, когда я вижу вывод из следующей команды, я знаю, что предыдущий закончен, однако делает это таким образом, замедляет меня, так как одна команда может занять 30 секунд до , тогда как после нее может быть еще 20 команд, которые принимали только секунд и я хочу обработать их как можно ближе к реальному времени, так как возможно .

  2. Я мог бы обернуть свою команду в крошечном сценарии bash, который выводит «Процесс с некоторым ID DONE», чтобы получить уведомление о завершении команды. I не очень нравится, потому что я выполняю несколько сотен команд за раз, и на самом деле не хочу добавлять все эти дополнительные bash процессов.

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

Мое понимание заключается в том, что параллель реализована в perl, с которой мне комфортно, но скорее не придется добавлять функциональность самостоятельно, если она не будет полностью необходимой.

Любая помощь или предложения приветствуются.

+0

Может быть, вы могли бы попробовать 'stdbuf -O0 параллельно ...' (или аналогичный), чтобы отключить буферизацию строки, 'parallel' делает? – bishop

ответ

2

Поведение по умолчанию с --tag должно работать отлично. Он ничего не выдаст, пока работа не будет выполнена. И тогда ваш постпроцессор может просто захватить аргумент с начала строки.

Пример:

parallel -j3 --tag 'echo Job {} start; sleep {}; echo Job {} ended' ::: 7 1 3 5 2 4 6 

Если вы хотите сохранить порядок:

parallel -j3 --keep-order --tag 'echo Job {} start; sleep {}; echo Job {} ended' ::: 7 1 3 5 2 4 6 

Обратите внимание, как рабочие места будут смешиваться, если вывод был сделан немедленно. Сравните с --ungroup (который вы не хотите):

parallel -j3 --ungroup 'echo Job {} start; sleep {}; echo Job {} ended' ::: 7 1 3 5 2 4 6