xargs --max-proc Ausgabe pro Prozess aufteilen?

xargs --max-proc Ausgabe pro Prozess aufteilen?

Ich habe die xargs --max-procsFunktion vor Kurzem entdeckt.

Wie kann ich die Ausgabe des Befehls proc aufteilen? Soll ich einfach ein erstellen mycommand --logfile $LOGFILEoder kann ich das von xargs selbst aus tun?

Ein Beispiel (für Womble):

Angenommen, ich habe das Skript myprocessor.sh und eine Liste von Dateien. Sie können in beliebiger Reihenfolge erscheinen, aber ich möchte die Protokollierung für jede Datei einzeln beibehalten. Dann:

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

könnte der parallele Job sein, den ich ausführen möchte. Wenn myprocessor.sher großspurig ist, möchte ich, dass jeder Aufruf in ein anderes Protokoll gedruckt wird. Andernfalls ist die Standardausgabe für jeden gleich und die Protokolle geraten durcheinander.

Antwort1

Sie können dies tun, indem Sie Ihren xargs-Befehl über eine Shell ausführen. Dadurch können Sie die Ausgabe umleiten, etwa so:

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

...Sie müssen es wahrscheinlich ein wenig optimieren - xargs ersetzt {} durch das Element/die Datei, an der es arbeitet

Antwort2

GNU Parallelhttp://www.gnu.org/software/parallel/scheint für Sie gemacht zu sein, da es die Standardausgabe der Prozesse automatisch richtig kombiniert.

find $MY_FILE_TREE --print0 | parallel --null --max-procs 3 --max-args 1 --no-run-if-empty myprocess.sh ">" {}.output

oder kürzer:

find $MY_FILE_TREE --print0 | parallel -0 -j3 -r myprocess.sh ">" {}.output

Sehen Sie sich das Einführungsvideo an:http://www.youtube.com/watch?v=OpaiGYxkSuQ

Antwort3

Sie könnten Ihr Skript so ändern, dass es beim Start eine zufällige Zahl/einen zufälligen Text auswählt und dann jeder Zeile diese Zahl voranstellt. Dann können Sie es später mit grep aufteilen.

verwandte Informationen