Das muss ich tun:
- Starten Sie Prozess A im Hintergrund
- Warten Sie x Sekunden
- Starten Sie Prozess B im Vordergrund
Wie kann ich das Warten ermöglichen?
Ich sehe, dass 'Schlaf' alles zum Stillstand zu bringen scheint und ich nicht wirklich 'warten' möchte, bis Prozess A vollständig abgeschlossen ist. Ich habe einige zeitbasierte Schleifen gesehen, aber ich frage mich, ob es etwas saubereres gibt.
sleep
Prozess A angehalten wird? Können Sie den von Ihnen verwendeten Testprozess anzeigen oder eine Ausgabe anzeigen, die dies anzeigt? Wenn Prozess A angehalten wird , ist es wahrscheinlicher, dass er versucht, vom Terminal zu lesen, während er im Hintergrund ausgeführt wird und aus diesem Grund angehalten wird, anstatt irgendetwas damit zu tunsleep
.process_a </dev/null &
wird befestigen seine stdin/dev/null
anstatt die TTY, und dass ausreichend sein kann , um das Problem zu vermeiden.Antworten:
Wenn ich Ihre Frage nicht falsch verstehe, kann sie einfach mit diesem kurzen Skript erreicht werden:
(und fügen Sie
wait
am Ende ein zusätzliches hinzu, wenn Ihr Skriptprocess_a
vor dem Beenden auf den Abschluss warten soll ).Sie können dies sogar als Einzeiler tun, ohne dass ein Skript erforderlich ist (wie von @BaardKopperud vorgeschlagen):
quelle
bash
. Jede Shell, einschließlich der Ihres Systemssh
, muss also keine Abhängigkeit von Bash für Ihr Skript hinzufügen.Sie können den Hintergrundsteuerungsoperator (&) verwenden , um einen Prozess im Hintergrund auszuführen, und den
sleep
Befehl , um zu warten, bevor ein zweiter Prozess ausgeführt wird, dh:Hier ist ein Beispiel für zwei Befehle, die einige zeitgestempelte Nachrichten ausdrucken:
Führen Sie es aus, um zu überprüfen, ob es das gewünschte Verhalten aufweist:
quelle
Ich mag die Antwort von @ dr01, aber er überprüft den Exit-Code nicht und Sie wissen nicht, ob Sie erfolgreich waren oder nicht.
Hier ist eine Lösung, die die Exitcodes überprüft.
Normalerweise speichere ich die PIDs in einem Bash-Array und dann ist die PID-Prüfung eine for-Schleife.
quelle
A & sleep x; B; ret=$?; wait "$!" || exit "$ret"
process_b
im Vordergrund laufen. Vermutlichprocess_a
könnte das Programm beendet werden, währendprocess_b
es ausgeführt wird, aber Sie können es trotzdemwait
abrufen und den Beendigungsstatus erhalten, nachdem Sie den Beendigungsstatus des Vordergrunds aufprocess_b
normale Weise mit$?
direkt erfasst haben .