2017-08-22 4 views

Antwort

2
find . -name "recovery_script" | xargs -n1 -P8 sh 

für 8 Prozesse parallel.
Vorausgesetzt, es gibt mindestens 8 Orte, an denen "recovery_script" gefunden werden kann.

Das Argument -n1 ist erforderlich, um jeweils ein Argument an sh zu übergeben. Andernfalls wird xargs eine angemessene Anzahl von Argumenten füttern auf einmal sh, was bedeutet, es so etwas wie

sh dir1/recovery_script dir2/recovery_script dir3/recovery_script ... 

statt

sh dir1/recovery_script 
sh dir2/recovery_script 
sh dir3/recovery_script 
... 

parallel auszuführen versucht.

Bonus: Ihr Befehl kann länger als nur einen einzigen Befehl einschließlich Optionen sein. Ich verwende oft nice auf andere Prozesse lassen noch ohne Probleme weiter:

find . -name "recovery_script" | xargs -n1 -P8 nice -n19 

wo -n19-nice eine Option ist, nicht zu xargs.

(abgesehen: Wenn Sie jemals Platzhalter für -name in find verwenden, verwenden Sie die -print0 Option find und die -0 Option xargs: die Ausgabe und Eingabe durch den Null-Zeichen trennt, statt Leerzeichen (da letztere kann Teil des Dateinamens) Da Sie hier für den vollständigen Namen zu suchen, das ist kein Problem)


Vom xargs Manpage:..

SYNTAX: xargs ... [command [initial-Argumente]]

und

... und führt den Befehl (Standard/ist/Echo) ein oder mehrmals mit jedem Anfang -arguments gefolgt von Elementen aus der Standardeingabe gelesen.

Das Standardverhalten besteht also darin, die Argumente zu reproduzieren, die Sie xargs geben. Ein Befehl wie sh (vielleicht abhängig davon, welche ausführbare Datei Sie ausführen möchten) funktioniert dann.

+0

es läuft nicht alle Skript gleichzeitig – Alex

+0

@Alex Wie lange läuft ein einzelnes Recovery-Skript? Und wie viele Wiederherstellungsskripte gibt es (also die Ausgabe von 'find'). – Evert

+0

das Skript läuft ein paar Minuten und es gibt zehn Skripte. Ich laufe es von Unix 128bit – Alex

1

Diese Lösung verwendet keine Xargs, sondern ein einfaches Bash-Skript. Vielleicht kann es helfen:

#!/bin/sh 

for i in $(find -name recovery_script) 
do 
    { 
     echo "Started $i" 
     $i 
     echo "Ended $i" 
    } & 
done 
wait 
Verwandte Themen