2017-04-26 5 views
3

Ich habe ein Shell-Skript job.sh. JetztRun Shell-Skript parallel in bash/linux

#!/bin/bash 

table=$1 

sqoop job --exec ${table} 

wenn ich ./job.sh tabelle1

Das Skript tun erfolgreich ausgeführt:

Inhalte sind unten.

Ich habe die Tabellennamen in einer Datei tables.txt.

Jetzt möchte ich über die tables.txt Datei Schleife und führen Sie das job.sh Skript 10 mal parallel.

Wie kann ich das tun?

Im Idealfall, wenn ich das Skript ausführen möchte ich es wie folgt tun;

./job.sh table1 
./job.sh table2 
./job.sh table3 
./job.sh table4 
./job.sh table5 
./job.sh table6 
./job.sh table7 
./job.sh table8 
./job.sh table9 
./job.sh table10 

Welche Optionen sind verfügbar?

Antwort

3

können Sie tun nur

< tables.txt xargs -I% -n1 -P10 echo sqoop job --exec % 

die -P10 10 Prozesse parallel laufen. Und Sie brauchen nicht einmal das Hilfsskript.

Wie @CharlesDuffy kommentiert, benötigen Sie nicht die -I, z. Noch einfacher:

< tables.txt xargs -n1 -P10 echo sqoop job --exec 
+0

@CharlesDuffy wahr! Das "-I" wird in diesem Fall nicht benötigt. Es könnte hilfreich sein, wenn 'printf% s \ n" {1..20} | xargs -I% -n1 -P10 echo sqoop job --exec tabelle% ' – jm666

+0

Sicher, obwohl man' table {1..20} 'auch dort verwenden könnte, und die Haarigkeit vermeiden, die mit '-I' einhergeht. Zugegeben, das 255-Byte-String-Limit ist kein * unmittelbares * Problem, und die Tendenz, missbraucht zu werden, führt zu Injection-Attacken oder der POSIX-spezifizierten Begrenzung der Anzahl der Ersetzungen pro Kommandozeile (oder 5) ebenfalls, aber es ist etwas, das mir gerade als Geruch auffällt. –

0

Option 1

Starten Sie alle Skripte als Hintergrundprozesse durch & anhängt, z.B.

./job.sh table1 & 
./job.sh table2 & 
./job.sh table3 & 

Dies führt jedoch alle Jobs zur gleichen Zeit!

Option 2

Für mehr Zeit oder Speicher raubend Skripten können Sie eine begrenzte Anzahl von Aufgaben zur gleichen Zeit mit xargs laufen, wie zum Beispiel here beschrieben.

5

einfach mit GNU

parallel -a tables.txt --dry-run sqoop job --exec {} 

Beispielausgabe

sqoop job --exec table7 
sqoop job --exec table8 
sqoop job --exec table9 
sqoop job --exec table6 
sqoop job --exec table5 
sqoop job --exec table4 
sqoop job --exec table3 
sqoop job --exec table2 
sqoop job --exec table1 
sqoop job --exec table10 

Parallel Wenn das richtig aussieht, entfernen Sie einfach das --dry-run und laufen wieder für real.

Wenn Sie 4 Jobs mögen laufen zu einem Zeitpunkt, zu verwenden:

parallel -j 4 .... 

Wenn Sie einen Job pro CPU-Kern mögen, das ist die Standardeinstellung, so müssen Sie nichts tun.

Wenn Sie die Jobs mögen, um gehalten zu werden, fügt -k Option:

parallel -k ... 
+0

@CharlesDuffy Ich habe nicht erwähnt, dass OP hatte busybox, ich hatte eine ziemlich anständig spezifizierte Maschine erwartet, wenn Sie 'sqoop' laufen. –

+0

Sie haben Recht - ich muss über eine andere Frage nachgedacht haben. –