Итак, у меня есть ситуация, когда я запускаю множество команд с параллельным выполнением и передаю вывод в другой скрипт, который потребляет вывод. Проблема, с которой я сталкиваюсь, заключается в том, что мой сценарий, выполняющий обработку вывода, должен знать, когда конкретная команда завершила выполнение.
Я использую параметр --tag
, чтобы знать, какая команда сгенерировала вывод, но в настоящее время мне приходится ждать, пока не будет выполнено параллельное выполнение всех команд, прежде чем я узнаю, что я больше не получу вывод от конкретной команды. Из моего понимания параллельности я вижу следующие возможные решения, но ни одно из них мне не подходит.
Я мог бы сгруппировать выходные строки с опцией
--line-buffer
, чтобы выглядело так, будто они выполнялись последовательно. Затем, всякий раз, когда я вижу вывод следующей команды, я знаю, что предыдущая завершилась, однако выполнение этого таким образом замедляет меня, так как выполнение одной команды может занять 30 секунд, а после нее может быть 20 других команд, которые заняли всего одну секунду, и я хочу обрабатывать их как можно ближе к реальному времени.Я мог бы обернуть свою команду в крошечный сценарий bash, который выводит «Процесс с некоторым идентификатором DONE», чтобы получить уведомление о завершении команды. Мне это не очень нравится, потому что я запускаю несколько сотен команд одновременно и не хочу добавлять все эти дополнительные процессы bash.
Я действительно надеюсь, что мне просто что-то не хватает в документах, и там есть флаг, чтобы делать то, что я ищу.
Я так понимаю, что parallel реализован на Perl, с которым мне удобно, но я бы предпочел не добавлять функциональность самостоятельно, если в этом нет крайней необходимости.
Любая помощь или предложения приветствуются.
stdbuf -o0 parallel ...
(или аналогичный), чтобы отключить любую буферизацию строк, которую делаетparallel
? - person bishop   schedule 09.02.2016