2014-10-02 2 views
1

Я обрабатываю текстовый файл с несколькими параллельными процессами, порожденными xargs. Мне также нужно записать stdout из каждого процесса в отдельный файл журнала. Ниже приведен пример, где вывод каждого процесса чередуется в один файл - не то, что я хочу.Bash: Запись stdout из нескольких параллельных процессов xargs в отдельные файлы журналов

В идеале, каждый файл_журнал должен быть пронумерован по количеству файлов линии, то есть, файл_журнал-1, файл_журнал-2 и т.д.

cat inputfile.txt | xargs -n 1 -P 8 ./myScript.sh | tee logfile 

Было бы неплохо, чтобы избежать внешнего скрипта обертки, если это возможно, но если есть способ обернуть myScript документом здесь, это сработает.

+1

Внутри myScript.sh выполните файл 'exec> logfile - $$' или некоторые из них? В основном сценарий управляет его протоколированием, а не «xargs», пытающимся его использовать. – bishop

ответ

1

Попробуйте это:

nl inputfile.txt | xargs -n 2 -P 8 sh -c './myScript.sh "$1" > logfile-$0' 

Это предполагает каждый аргумент в inputfile.txt на своей собственной линии и не содержит пробелов. Команда nl номера каждой строки, которая объединяет каждый аргумент с уникальным номером. Команды xargs принимают по два аргумента, первый номер строки, второй - соответствующую строку от inputfile.txt и передает их sh. Команда sh использует аргументы для генерации имени выходного файла и аргумента myScript.sh соответственно.

+0

'' $ 1 "', а не голый '$ 1', но очень хорошая идея. –

+0

Это, вероятно, не имеет никакого значения, поскольку 'xargs' разделяет аргументы в пробелах, но я полагаю, что' inputfile.txt' может иметь приведенные аргументы. –

+0

@ Росс, Умное решение. Я также хочу, чтобы выходные данные на экране в дополнение к файлам журнала. Кажется, он работает с небольшим изменением: nl inputfile.txt | xargs -n 2 -P 8 sh -c './myScript.sh "$ 1" | tee logfile- $ 0 ' – Steve

2

Вы можете использовать GNU Parallel, а и его -k возможность сохранить вывод в порядке, в одном файле журнала:

cat input | parallel -k ./myScript.sh > file.log 

Вы можете добавить -j 8 после parallel держать 8 ядер занят, но он будет держать в любом случае все ядра заняты по умолчанию.

+0

Вы смотрите на источник на GNU параллельно? Делает крысиные гнезда похожими на модели хорошей организации. –

+0

@CharlesDuffy У меня есть на самом деле, и я согласен, что это трудно читать, но мой опыт в том, что он работает каждый раз, когда я его использую. Мне также очень сложно читать ядро ​​Linux тоже ... :-) –

+0

@CharlesDuffy Усовершенствования всегда приветствуются, если они не нарушают текущую функциональность. –