Ein Ziel in meinem Makefile ist eine sehr CPU- und zeitraubende Aufgabe. Aber ich kann die Arbeitslast aufteilen und die Aufgabe mehrmals parallel ausführen, um den gesamten Prozess zu beschleunigen.make: Mehrere Tasks parallel ausführen und auf die Fertigstellung warten
Mein Problem ist, dass make nicht auf den Abschluss aller Prozesse wartet.
Betrachten Sie dieses einfache Skript, mit dem Namen myTask.sh
:
#!/bin/bash
echo "Sleeping $1 seconds"
sleep $1
echo "$1 are over!"
Jetzt wollen wir nennen dies von einem Bash-Skript, und verwenden Sie wait
für alle Aufgaben warten vervollständigen:
#!/bin/bash
echo "START"
./myTask.sh 5 &
./myTask.sh 15 &
./myTask.sh 10 &
wait # Wait for all tasks to complete
echo "DONE"
Der Ausgang ist wie erwartet:
START
Sleeping 15 seconds
Sleeping 5 seconds
Sleeping 10 seconds
5 are over!
10 are over!
15 are over!
DONE
Aber wenn man versucht, das gleiche in ein Makefile
:
test:
echo "START"
./myTask.sh 5 &
./myTask.sh 15 &
./myTask.sh 10 &
wait
echo "DONE"
es nicht funktioniert:
START
Sleeping 5 seconds
Sleeping 15 seconds
Sleeping 10 seconds
DONE
[email protected]:~/testwait $5 are over!
10 are over!
15 are over!
Natürlich habe ich mehrere Ziele schaffen könnte, die „gebaut“ werden können parallel nach Marke, oder lassen Sie die Bash-Skript laufen lassen nur welche die Aufgaben ausführt. Aber gibt es einen Weg, es mehr zu tun, als was ich schon versuchte?
Mein erster Versuch wäre, alle relevanten Befehle in die gleiche Zeile zu setzen: './myTask.sh 5 & ./myTask.sh 15 & ./myTask.sh 10 & wait' – melpomene
Idealer Job für ** GNU Parallel ** ... 'parallel ./myTask.sh ::: 5 10 15' –
Wenn Sie ** GNU make ** verwenden, und die "ONESHELL" -Feature installiert ist, wird Ihr Skript funktionieren * "wie es ist" * wenn Sie eine Zeile mit '.ONESHELL:' am Anfang hinzufügen, da dies Ihre gesamte erzwingen wird Rezept, um in einem einzigen Aufruf Ihrer Shell zu laufen. –