
Recientemente descubrí la xargs --max-procs
función.
¿Cómo se puede dividir la salida del comando por proc? ¿Debo simplemente crear un archivo mycommand --logfile $LOGFILE
o puedo hacerlo desde el propio xargs?
Un ejemplo (para womble):
Supongamos que tengo el script myprocessor.sh y una lista de archivos. Pueden ir en cualquier orden, pero quiero mantener el registro de cada uno por separado, luego:
find $MY_FILE_TREE --print0 | xargs --null --max-procs 3 --max-args 1 --no-run-if-empty myprocess.sh
podría ser el trabajo paralelo que quiero ejecutar. Si myprocessor.sh
es hablador, entonces me gustaría poder imprimir cada invocación en un registro diferente. De lo contrario, la salida estándar para cada uno es la misma y los registros se confunden.
Respuesta1
Puedes hacer esto ejecutando tu comando xargs a través de un shell; esto te permitirá redirigir la salida, algo como esto:
find blah -type f | xargs -I{} -P 4 -n 1 sh -c 'yourcommand --input {} > {}.output'
...probablemente tendrás que modificarlo un poco: xargs reemplaza {} con el elemento/archivo en el que está trabajando
Respuesta2
Paralelo GNUhttp://www.gnu.org/software/parallel/parece estar hecho para usted, porque combina automáticamente y correctamente el resultado estándar de los procesos.
find $MY_FILE_TREE --print0 | parallel --null --max-procs 3 --max-args 1 --no-run-if-empty myprocess.sh ">" {}.output
o más corto:
find $MY_FILE_TREE --print0 | parallel -0 -j3 -r myprocess.sh ">" {}.output
Mira el vídeo de introducción:http://www.youtube.com/watch?v=OpaiGYxkSuQ
Respuesta3
¿Podría cambiar su secuencia de comandos para que al inicio elija un número/texto aleatorio y luego anteponga cada línea con este número? Luego podrás dividirlo usando grep.