Bash Prozessausgabestatus

339
TomyOne

Ich würde gerne nach neuen Prozessen in bash script fragen.

Ich habe ein Skript, das externe Programmtests ausführt und dann den Ausgabestatus überprüft und druckt, ob der Test erfolgreich war oder nicht. Diese Tests werden nacheinander ausgeführt.

Und jetzt brauche ich noch ein paar andere Tests, deren Skript für jeden dieser Tests einen neuen Prozess erstellt. Wie viele Tests es gibt, lassen Sie uns sagen. Jetzt möchte ich 3 Tests parallel und sogar mit ersten sequentiellen Tests ausführen. Und ich würde gerne wissen, ob es möglich ist, den Ausgabestatus dieser separaten Prozesse in mein Skript zurückzuholen und sie zu protokollieren? Ich muss diese Werte separat von jedem laufenden Prozess abrufen. Ich möchte diese sequentiell laufenden Prozesse nicht anhalten. Diese 3 Tests laufen weiterhin in Zyklen mit aufeinanderfolgenden Tests.

Um es zusammenzufassen, muss ich in bash irgendwie ein Regressionsskript erstellen, das in den Zyklen TESTS1 ausgeführt wird, obwohl es sequentiell ausgeführt wird und TESTS2, die im Hintergrund ausgeführt werden, da ihre Ausführung länger als TESTS1 ist. Aber ich brauche irgendwie, um TESTS2 im Hintergrund auszuführen, um zu überprüfen, ob sie noch laufen, ihren Ausgangsstatus an das übergeordnete Skript zurückzuschreiben, um Werte zu protokollieren und gleichzeitig TESTS1 auszuführen.

Jetzt verwende ich ein assoziatives Array, um die PID von untergeordneten Prozessen von TESTS2 zu protokollieren und zu testen, ob eine bestimmte Test-ID ausgeführt wird. Wenn nicht, starte ich sie erneut. Aber ich weiß nicht, wie ich seine ID bekomme. weil das Lesen des letzten Prozessausgabestatus nicht von diesem Test sein muss, den ich teste, ist vorhanden.

 # Create array  declare -A processes for test in $; do processes[$test]=0 done # background prcess fork() { OUT=$($TEST) STATUS=$? if [ $STATUS -eq 0 ]; then # do staff if ok ((OK++))  else # do staff if fail ((FAIL++)) fi  }  # -----------------------------------------------------------------------------  # Repeat Tests i-times for ((i=1; i<=100; i++)) do # RUN backgroung proceses for TEST in $; do # check if PID lives kill -0 $ &> /dev/null stat=$?  # if 0 or not running run it... if [[ $ == 0 || $stat > 0 ]]; then  fork $TEST $cnt & processes[$TEST]=$! # log PID fi  done  # Cycle through TESTS1 for TEST in $; do OUT=$($TEST) STATUS=$? if [ $STATUS -eq 0 ]; then # do staff if ok ((OK++))  else # do staff if fail ((FAIL++)) fi echo -ne "** NOTE: Running Regress Tests: Cycle: $i PASS: $ccount FAIL: $fcount ...\r"  done 

Kann jemand irgendwelche Ideen haben? Vielen Dank

0

2 Antworten auf die Frage

0
l0b0

Um den Exit-Code für einen Hintergrundprozess zu erhalten, verwenden Sie wait:

$ (sleep 1; false) & pid_1=$!; (sleep 1; true) & pid_2=$! [1] 29111 [2] 29112 $ wait $pid_1 $ echo $? 1 $ wait $pid_2 $ echo $? 0 
Ja Danke, aber warten wird mein übergeordnetes Skript stoppen und auf einen bestimmten bg-Prozess warten. Ich muss andere Tests ausführen und nicht auf bg-Prozesse warten. Ich muss den Ausgabestatus abrufen, wenn der bg-Prozess endet, und nicht darauf warten, dass er endet. TomyOne vor 9 Jahren 0
0
Ge2rt

Wie wäre es, wenn Sie die PIDs und den Ausgabestatus in eine temporäre Datei schreiben, z. B. über 'mktemp'. Nachdem Sie einen TEST beendet und seinen Status überprüft haben, löschen Sie einfach die temporäre Datei und erstellen Sie eine neue, wenn der nächste TEST ausgeführt wird. Oder lassen Sie alle temporären Dateien für spätere Referenzzwecke und überprüfen Sie die Zeitstempel der temporären Dateien, um denjenigen zu erhalten, der sich auf den aktuell ausgeführten TEST bezieht.