Назад | Перейти на главную страницу

xargs --max-proc разделить вывод на процесс?

Я недавно обнаружил xargs --max-procs характерная черта.

Как можно разделить вывод команды по процессу? Должен ли я просто создать mycommand --logfile $LOGFILE, или можно из самого xargs?

Пример (для вомбла):

Предположим, у меня есть скрипт myprocessor.sh и список файлов. Они могут идти в любом порядке, но я хочу вести журнал для каждого отдельно, а затем:

find $MY_FILE_TREE --print0 | xargs --null --max-procs 3 --max-args 1 --no-run-if-empty myprocess.sh  

может быть параллельное задание, которое я хочу запустить. Если myprocessor.sh болтлив, то я хотел бы иметь возможность выводить каждый вызов в отдельный журнал. В противном случае стандартный вывод для каждого будет одинаковым, и журналы будут беспорядочными.

GNU Parallel 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

Вы можете сделать это, запустив команду xargs через оболочку - это позволит вам перенаправить вывод - примерно так:

find blah -type f | xargs -I{} -P 4 -n 1 sh -c 'yourcommand --input {} > {}.output'

... вам, вероятно, придется немного подправить его - xargs заменяет {} элементом / файлом, над которым работает

Вы могли бы изменить свой скрипт, чтобы при запуске он выбирал случайное число / текст, а затем префикс каждой строки этим номером? Затем вы можете позже разделить его с помощью grep.