
Ich habe die xargs --max-procs
Funktion vor Kurzem entdeckt.
Wie kann ich die Ausgabe des Befehls proc aufteilen? Soll ich einfach ein erstellen mycommand --logfile $LOGFILE
oder 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.sh
er 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.