Nehmen wir an, ich habe fünf Bash ( .sh
) - Skripte in einem Ordner ( my_folder
), die wie folgt benannt sind:
script_1.sh
script_2.sh
script_3.sh
script_4.sh
script_5.sh
Wie kann ich ein sechstes Bash-Skript oder nur einen Einzeiler schreiben, der alle diese Skripte zusammen ausführt?
Ich brauche die fünf Skripte, um alle gleichzeitig und nicht nacheinander auszuführen.
Antworten:
GNU
parallel
ist perfekt für solche Dinge. Installieren mitsudo apt install parallel
und dann:Das
-j
steuert, wie viele Prozesse nicht parallel ausgeführt werden, und-j0
bedeutet "alle". Setzen Sie es auf einen anderen Wert (z. B.-j20
), um die Skripte stattdessen stapelweise auszuführen.quelle
parallel
Befehl aus demmoreutils
Paket. Die Beispielverwendung:parallel -j 20 -- my_folder/*.sh
(Im Gegensatz zu GNUparallel
werden-j0
die Skripte einzeln ausgeführt.)sudo apt install parallel
die Datei/usr/bin/parallel
durch die von GNU parallel ersetzt wird. Solange Sie es installieren, sollte es, wie meine Antwort andeutet, wie erwartet funktionieren.parallel
Befehle aus dem Handbuch versuchte, während ich meine Antwort schrieb, um GNU parallel vorzuschlagen.Um alle Skripte gleichzeitig (parallel) auszuführen, verwenden Sie:
Um das eine nach dem anderen (nacheinander) auszuführen, verwenden Sie:
Verbesserung für Kommentare
Wenn Sie 200 Skripte haben, die Sie gleichzeitig ausführen möchten (was die Maschine übrigens blockieren könnte), verwenden Sie dieses Skript:
Setzen Sie die Skriptattribute mit dem folgenden Befehl auf ausführbar:
Wenn Sie das Skript zum ersten Mal ausführen, werden nur die Namen der 200 Skripte wiedergegeben, die ausgeführt werden. Wenn Sie zufrieden sind, werden die richtigen Namen ausgewählt. Bearbeiten Sie das Skript und ändern Sie diese Zeile:
zu:
Es gibt drei Möglichkeiten, wie Sie ein Bash-Skript von einem anderen aufrufen können, wie hier beantwortet:
Im Fall von OP enthielten eines oder mehrere der 200 Skripte nicht die
#!/bin/bash
erste Zeile von shebang in der Datei. Als solche musste Option 3. verwendet werden.200 Skripte werden gleichzeitig ausgeführt
Es wurde ein Kommentar dazu abgegeben, ob sie "zur gleichen Zeit laufen". Auf einem typischen 8-CPU-System teilen sich 25 Skripte gleichzeitig eine CPU, es wird jedoch jeweils nur ein Skript ausgeführt, bis die Zeitscheibe (gemessen in Millisekunden) abgelaufen ist. Dann erhält der nächste Job seinen angemessenen Anteil an Millisekunden, dann der nächste Job usw. usw.
In losen Worten können wir sagen, dass 200 Jobs "gleichzeitig", aber nicht "gleichzeitig" auf 8 CPUs ausgeführt werden, was 25 Jobs pro CPU entspricht:
Oben Bild und Kommentare unten vom Linux-Kernel-Scheduler
quelle
bash
Präfix zum Aufrufen des Skripts enthält.Es gibt ein Werkzeug dafür, lesen Sie
man run-parts
.Zum Beispiel mache ich:
in meinem Palm Pilot Backup-Skript.
${visorhome}/pbackup.d/
::quelle
run-parts
die Skripte nacheinander und nicht alle auf einmal ausgeführt werden, wie es das OP verlangt hat. Sie haben jedoch Recht, dass das Ausführen von 200 Skripten auf einmal wahrscheinlich nicht die gleiche Leistung wie das Ausführen von 5 aufweist - und selbst wenn das gleichzeitige Ausführen aller Skripte keine Probleme verursacht, ist dies möglicherweise immer noch unnötig. Ich habe kommentiert , um dem OP vorzuschlagen, ihre diesbezüglichen Präferenzen zu klären.run-parts
führt die Skripte nicht aus (sie haben einen Punkt im Namen:my_folder/*.sh
run-parts
hat aus irgendeinem seltsamen Grund sehr spezifische Anforderungen an den Dateinamen. Es werden keine Dateinamen mit Erweiterungen gestartet, daher befürchte ich, dass dies hier nicht funktioniert.So führen Sie alle
*.sh
Skripte gleichzeitig immy_folder
Verzeichnis ausxargs
:So begrenzen Sie die Anzahl gleichzeitig ausgeführter Skripte auf
10
:quelle
ls
in einem Skript zu verwenden. Verwendenfind
ist viel sicherer. Es ist das allererste Element hier: mywiki.wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29