GNU Parallel — обнаружение завершения параллельного запуска команды

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

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

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

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

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

Я так понимаю, что parallel реализован на Perl, с которым мне удобно, но я бы предпочел не добавлять функциональность самостоятельно, если в этом нет крайней необходимости.

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


person Brandon Wigfield    schedule 08.02.2016    source источник
comment
Возможно, вы могли бы попробовать stdbuf -o0 parallel ... (или аналогичный), чтобы отключить любую буферизацию строк, которую делает parallel?   -  person bishop    schedule 09.02.2016


Ответы (1)


Поведение по умолчанию с --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
person Ole Tange    schedule 08.02.2016