Bash: Begrenzen Sie die Anzahl gleichzeitiger Jobs?
Gibt es eine einfache Möglichkeit zum einschränken der Anzahl der gleichzeitigen Aufträge in der bash? Damit meine ich, machen die & block, wenn es mehrere sind dann n concurrent jobs, die im hintergrund laufen.
Ich weiß, kann ich implementieren diese mit ps | grep -Stil tricks, aber gibt es einen einfacheren Weg?
Kommentar zu dem Problem - Öffnen
Ich denke diese Frage könnte dir helfen: stackoverflow.com/questions/38160/parallelize-bash-script
So viele verworrene Antworten, aber keine Möglichkeit zu sagen, " bash "maximal zehn gleichzeitige Arbeitsplätze!". Ich denke, es ist nicht ein dann. Schade, das wäre wirklich ein nettes feature.
InformationsquelleAutor der Frage static_rtti | 2009-10-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie GNU Parallel http://www.gnu.org/software/parallel/ installiert, können Sie dies tun:
ausgeführt wird eine gzip-pro CPU-Kern, bis alle logfiles sind gzipped.
Wenn es Teil einer größeren Schleife, die Sie verwenden können
sem
statt:Wird es nicht die gleichen, aber Sie geben Ihnen eine chance, mehr zu tun, Sachen für jede Datei.
Wenn GNU Parallel ist nicht als Paket für Eure distribution installieren kann GNU Parallel einfach durch:
Wird der download, überprüfen Sie die Signatur und eine persönliche Installationsanleitung wenn Sie es nicht installieren können, weltweit.
Uhr die intro-videos für GNU Parallel, um mehr zu erfahren:
https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
InformationsquelleAutor der Antwort Ole Tange
Das folgende Skript zeigt eine Möglichkeit, dies mit Funktionen. Sie können entweder die
bgxupdate
undbgxlimit
Funktionen in Ihrem Skript oder in einer separaten Datei, die stammt aus dem Skript mit:Es hat den Vorteil, dass Sie pflegen können mehrere Gruppen von Prozessen voneinander unabhängig (Sie können laufen, zum Beispiel, eine Gruppe mit einem limit von 10 und andere separate Gruppe mit einem limit von 3).
Es verwendet die
bash
built-injobs
, um eine Liste der sub-Prozesse, sondern pflegt diese in den einzelnen Variablen. In der Schleife an der Unterseite, können Sie sehen, wie nennen diebgxlimit
Funktion:bgxgrp
.bgxlimit
mit dem limit Befehl, den Sie ausführen möchten.Natürlich, wenn man nur eine Gruppe, verwenden Sie einfach
bgxgrp
direkt anstatt die übertragung in die und aus.Hier ist ein Beispiel-Lauf:
n*10
Sekunden, so dass der vierte Prozess wird nicht gestartet, bis die ersten Ausfahrten (zur Zeit t=10 oder 12:38:10). Sie können sehen, dass Prozess 3368 hat aus der Liste verschwunden, bevor 1560 Hinzugefügt.Oder, in der Zeit-Online-Formular:
InformationsquelleAutor der Antwort paxdiablo
Einem kleinen bash-script könnte dir helfen:
Wenn Sie rufen:
...vier mal, die ersten drei Aufrufe sofort zurück, der vierte Aufruf blockiert, bis es weniger als drei Aufträge ausführen.
Starten Sie dieses Skript in der aktuellen Sitzung, indem Sie mit
.
, weiljobs
listet nur die jobs, die von der aktuellen Sitzung.Den
sleep
innen hässlich ist, aber ich habe nicht einen Weg finden, zu warten, für den ersten job, der beendet wird.InformationsquelleAutor der Antwort tangens
Vorausgesetzt, Sie möchten, schreiben Sie code wie diesen:
Wo
max_bg_procs
sein sollte, setzen Sie in Ihrem.bashrc
:InformationsquelleAutor der Antwort Aaron McDaid
Hier ist der kürzeste Weg:
Diese Funktion aufrufen, bevor die Verzweigung aus jedem neuen job:
Haben so viele hintergrund-jobs, die als Kerne in die Maschine, verwenden Sie
$(nproc)
anstelle einer festen Zahl wie 10.InformationsquelleAutor der Antwort Scarabeetle
Diesem vielleicht gut genug für die meisten Zwecke aber nicht optimal.
InformationsquelleAutor der Antwort cat
Wenn Sie bereit sind zu tun, das außerhalb der reinen bash, sollten Sie sich in einen job-queuing-system.
Zum Beispiel gibt es GNU-queue oder PBS. Und für PBS, vielleicht möchten Sie sich in Maui für die Konfiguration.
Beide Systeme erfordert etwas Konfiguration, aber es ist durchaus möglich, eine bestimmte Anzahl von jobs laufen auf einmal, nur neu starten von jobs aus der Warteschlange wenn Sie einen Laufenden job beendet ist. In der Regel werden diese job-queuing-Systeme verwendet werden würde, auf der supercomputing-Clustern, wo Sie möchten, reservieren Sie eine bestimmte Menge an Speicher oder Rechenleistung zu einem bestimmten batch-job; es gibt jedoch keinen Grund, Sie nicht verwenden können, eine dieser auf einem einzelnen desktop-computer, die ohne Rücksicht auf Rechenzeit oder Speicher-Grenzen.
InformationsquelleAutor der Antwort Mark Rushakoff
Unter Linux verwende ich diese zur Begrenzung der bash Arbeitsplätze zu der Anzahl der verfügbaren CPUs (möglicherweise überschrieben durch die Einstellung der
CPU_NUMBER
).InformationsquelleAutor der Antwort Tuttle
Haben Sie darüber nachgedacht seit zehn Dauerbrenner-listener-Prozesse und mit Ihnen zu kommunizieren über named pipes?
InformationsquelleAutor der Antwort Steven Huwig
können Sie ulimit -u
sehen http://ss64.com/bash/ulimit.html
InformationsquelleAutor der Antwort Shay
Folgende Funktion (entwickelt von tangens Antwort oben, entweder kopieren in Skript-oder Quelle-Datei):
1) erfordert Lediglich das einfügen einer einzigen Zeile zu beschränken, eine vorhandene Schleife
2) Wartet auf die Fertigstellung des vorhandenen hintergrund-Aufgaben eher als polling, die Erhöhung der Energieeffizienz für schnelle Aufgaben
InformationsquelleAutor der Antwort user3769065