
Я недавно обнаружил эту xargs --max-procs
функцию.
Как разделить вывод команды по proc? Мне просто создать mycommand --logfile $LOGFILE
, или я могу сделать это из самого xargs?
Пример (для womble):
Предположим, у меня есть скрипт myprocessor.sh и список файлов. Они могут идти в любом порядке, но я хочу вести логирование для каждого отдельно, тогда:
find $MY_FILE_TREE --print0 | xargs --null --max-procs 3 --max-args 1 --no-run-if-empty myprocess.sh
может быть параллельной работой, которую я хочу запустить. Если myprocessor.sh
это многословно, то я хотел бы иметь возможность выводить каждый вызов в отдельный журнал. В противном случае stdout для каждого будет одинаковым, и журналы будут перемешаны.
решение1
Это можно сделать, запустив команду xargs через оболочку — это позволит перенаправить вывод — примерно так:
find blah -type f | xargs -I{} -P 4 -n 1 sh -c 'yourcommand --input {} > {}.output'
...вам, вероятно, придется немного подправить его - xargs заменяет {} на элемент/файл, с которым он работает
решение2
GNU-параллельныйhttp://www.gnu.org/software/parallel/похоже, он создан специально для вас, поскольку он автоматически и правильно объединяет стандартный вывод процессов.
find $MY_FILE_TREE --print0 | parallel --null --max-procs 3 --max-args 1 --no-run-if-empty myprocess.sh ">" {}.output
или короче:
find $MY_FILE_TREE --print0 | parallel -0 -j3 -r myprocess.sh ">" {}.output
Посмотрите вступительное видео:http://www.youtube.com/watch?v=OpaiGYxkSuQ
решение3
Вы могли бы изменить свой скрипт так, чтобы при запуске он выбирал случайное число/текст, а затем добавлял это число к каждой строке? Затем вы можете позже разделить его с помощью grep.