Aufgabe: Ausführen von Blöcken aus 3-5 Befehlen (parallel / im Hintergrund). Beispielblock:
dd if=/dev/urandom of=/mnt/1/x bs=1024 count=1024000000 &
dd if=/dev/urandom of=/mnt/2/x bs=1024 count=1024000000 &
dd if=/dev/urandom of=/mnt/3/x bs=1024 count=1024000000 &
Wenn es fertig ist, sollte der nächste Block ausgeführt werden. Ich nehme an, dies kann über Sperrdateien erfolgen:
task1.sh:
real_task1 real_param1 ; rm /var/lock/myscript/task1.lock
task2.sh:
real_task2 real_param1 ; rm /var/lock/myscript/task2.lock
...
taskgen.sh:
# loop
# while directory isn't empty - wait...
gen_tasks.pl # build task files from some queue
for i in 1 2 3; do touch /var/lock/myscript/task$i.lock ; done
./task1.sh &
./task2.sh &
./task3.sh &
# if task1.sh doesn't exits then exit, else loop waits for files to be deleted
Eine Reihe von Methoden zum Überprüfen, ob das Verzeichnis leer ist, finden Sie hier. Sie sind sich nicht sicher, welche Sie verwenden sollen.
Frage : Gibt es einen besseren Weg, dies umzusetzen?
PS Mögliche Methode zur Statusmeldung:
command && report_good_state.sh taskid ; report_state_done.sh taskid; rm /var/lock/myscript/taskN.lock
Antworten:
Genau dafür wurde gnu parallel entwickelt. Ich empfehle daher dringend, es zu verwenden. Betrachten Sie insbesondere das Ausführen als Semaphor :
quelle
Vielleicht eine Variation davon?
quelle
Haben Sie einen bestimmten Grund, so etwas wie GNU nicht parallel zu verwenden ? Wenn Sie bash verwenden müssen, sollten Sie Methoden wie die in diesem Blogbeitrag beschriebenen in Betracht ziehen (Wartezeit und Named Pipes sind hier hilfreich).
quelle
"wait" wartet, bis alle Hintergrundjobs abgeschlossen sind. Stichprobe:
30 schlafen & 40 schlafen & 120 schlafen & warten
Es wartet, bis alle Befehle abgeschlossen sind, dh mindestens 120 Sekunden für dieses Beispiel.
Hoffe das hilft.
quelle
Wir haben versucht, das GNU sem-Dienstprogramm zu verwenden , wie oben von Phil Hollenback beschrieben, fanden es jedoch zu schwer (mehr als 300 Instanzen haben die Maschine lahmgelegt). Ich habe mich nach ähnlichen Werkzeugen umgesehen, um ein leichtes Zählsemaphor zu implementieren, konnte aber nichts Passendes finden.
Also habe ich selbst eine mit Flock implementiert, sie heißt semaphorisch .
quelle