2016-04-25 6 views
2

Ich habe eine C++ ausführbare Datei mit dem Namen Test. Ich möchte den Code GetExitCodeProcess() herausfinden, wenn die Ausführung abgeschlossen ist.Erhalten Sie den Exit-Status eines Prozesses in Bash

Ich kann den Statuscode herausfinden, indem Sie den folgenden in einem anderen Wrapper-Programm als solches Schreiben:

... 
int status = system("./Test"); 

und überprüfen dann für WIFSIGNALED/WIFSTOPPED etc Status.

Aber anstatt ein Wrapper-Programm zu schreiben, kann ich den Exit-Status-Code von der PID des Programms erhalten, indem ich ein Bash-Skript schreibe?

Edit: Schreiben ein '$' in der Bash nach der Ausführung ./Test gibt die Lösung für das oben genannte Problem?

Bearbeiten: Zusammenfassung ist-- Wenn ich eine ausführbare Datei von der Befehlszeile ausführen, wie bekomme ich (kein Programm) den Exit-Status.

+0

Sie verwenden C++, um Skript aufzurufen, verwenden Sie C++, um den Exit-Status zu erhalten - rufen Sie kein anderes Skript auf, da sind zu viele Dinge auf dem Weg. – SaintHax

Antwort

3

Sie können einfach eine echo $? nach dem Ausführen des Befehls/bash, die den Exit-Code des Programms ausgeben wird tun.

Jeder Befehl gibt einen Exit-Status zurück (wird manchmal als Rückkehr Status oder Exit-Code bezeichnet). Ein erfolgreicher Befehl gibt 0 zurück, während ein fehlgeschlagener einen Wert ungleich Null zurückgibt, der normalerweise als Fehlercode interpretiert werden kann. Gut erzogene UNIX Befehle, Programme und Dienstprogramme geben einen 0 Exitcode nach erfolgreicher Beendigung zurück, obwohl es einige Ausnahmen gibt.

echo $? # Non-zero exit status returned -- command failed to execute. 

echo 

exit 113 # Will return 113 to shell. 
      # To verify this, type "echo $?" after script terminates. 

# By convention, an 'exit 0' indicates success, 
#+ while a non-zero exit value means an error or anomalous condition. 

Alternativ, wenn Sie möchten (mit nohup oder laufen im Hintergrund & Operator gestartet) Return-Code für einen Hintergrundprozess/script identifizieren Sie die pid des Prozesses/script bekommen konnte gestartet und warten, bis es zu beenden und Dann besorge dir den Exit-Code.

$ ./foo.sh & 
[1] 28992   # Some random number for the process-id 

$ echo $!   # Get process id of the background process 
28992 

$ wait 28992  # Waits until the process determined by the number is complete 

[1]+ Done   ./foo.sh 

$ echo $?   # Prints the return code of the process 
0 

Mehr info @http://tldp.org/LDP/abs/html/exit-status.html

+0

Ich glaube nicht, dass b/c system() ihm bereits die gleichen Informationen gibt $? tut. Während diese Antwort Upvotes erhalten hat, gilt sie für ein Bash-Skript, das ein anderes Skript aufruft, und nicht für ein C++ - Programm, das ein Bash-Skript aufruft. Von meinem Verständnis des OP. – SaintHax

+0

Wenn ich mich recht erinnere, von der OP 'Aber, anstatt ein Wrapper-Programm zu schreiben, kann ich den Exit-Status-Code von der PID des .Test-Programms erhalten, indem ich ein Bash-Skript schreibe?' Das ist im Grunde ein Bash-Skript, das ein anderes Skript aufruft. Bin OK, den Beitrag zu löschen, wenn er irrelevant ist, was in diesem Fall nicht der Fall ist. – Inian

1

Sie nähern sich dieses wrong-- system() bereits kehrt der exist Status: Null für den Erfolg, nicht-Null für das Scheitern. Was wahrscheinlich passieren wird, ist Ihr "Test" -Skript falsch geschrieben oder Sie testen "Status" falsch. Ich habe die folgenden Skriptfehler von Entwicklern gesehen.

Zu keiner Zeit verfolgen sie den Exit-Code, das Skript gibt den letzten Exit-Code des echo-Befehls zurück. Was es immer erfolgreich macht. Hier sind zwei Möglichkeiten, richtig zu beenden (und ich weiß, dass andere Programmierer etwas bessere Möglichkeiten haben, als diese erste, aber ich glaube nicht, dass es in diesem Thread darum geht). Krabbeln, dann laufen, dann rennen.

Wenn Sie den Exit-Status benötigen, aber alle Shell-Befehle ausgeführt werden sollen.

return_code=0 

mv $letters $ARCHIVE 
return_code=$(($return_code + $?)) 

mv $letters $ARCHIVE 
return_code=$(($return_code + $?)) 

exit $return_code 

Wenn Sie auf das Scheitern verlassen wollen, gibt es set -e zu schauen, und hier ist eine andere Art und Weise.

mv $letters $ARCHIVE || exit 1 
mv $letters $ARCHIVE || exit 2 
Verwandte Themen