• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Exit Code in eine Variable schreiben

Hallo,

wie kann ich einen Exit Code eines Programmes in eine Variable schreiben lassen? Wenn ich z. B. mit par2 einen Usenet-Download prüfe und etwas nicht stimmt erhalte ich bei

Code:
echo $?

den Exit Code 2. $? ist doch aber der Exit Code des letzten Programmes. Könnte es also sein, dass wenn parallel ein anderes Programm läuft $? mir einen falschen Exit-Code anzeigt oder gilt der Exit Code immer für das aktuelle Terminalfenster oder das aktuelle Script? Mit der Ausgabe des Standard-Errors ist ja wohl etwas anderes gemeint, oder? Das sind die Fehlermeldungen die ggf. ausgegeben werden?

Aber wie schrieben ich den Exit Code in eine Variable?
 
OP
B

bunter fisch

Member
Ich meine etwas anderes, vielleicht ist das aber auch komplett falsch von mir gedacht.

Angenommen in einem Script läuft par2 und prüft einen Usenet-Download. Ist das Programm fertig wird ein Exit Code ausgegeben. Dieser kann ich mit 'echo $?' anzeigen lassen. Wenn nun (in einem anderen Script oder manuell gestartet oder was weiß ich) ein anderes Programm einen Exit Code ausgibt, wird dann "mein" Exit Code von par2 überschrieben und ich erhalte einen falschen?

Oder kann ich sicher sein, dass wenn ich in einem Script den Exit Code abfrage, es nur der Exit Code des letzten abgeschlossenen Programmes aus genau diesem Script heraus sein kann?
 

framp

Moderator
Teammitglied
Wenn Du in einem Script par2 synchron aufrufst wird $? den RC von par2 enthalten unabhaengig davon welche Scripts sonst noch im System laufen. Wenn Du aber par2 ansynchron gestartet hast (mit &) wird es kompliziert und da weiss ich auch keine Antwort :(
 
A

Anonymous

Gast
In Linux entstehen neue Prozesse immer und nur durch fork(). https://de.wikipedia.org/wiki/Fork_%28Unix%29 ( Ausnahme nur unmittelbar beim Systemstart, da gibts noch was anderes)

Das Bedeutet, wenn irgend ein Prozess/Programm/..... gestartet wird, dann wird dabei zuerst die komplette ProzessUmgebung des aktuellen Prozesses im Speicher dupliziert und dann in der duplizierten Umgebung der auszuführende Programmcode für das zu startende Programm da hinein geladen und dieses dann gestartet. Das aktuelle Programm ist dabei der sogenannte Vaterprozess, der dabei neu entstehende Prozess der Sohn-Prozess. Ein Neuer Prozess kann also immer nur dadurch entstehen, indem der aufrufende Prozess im Hauptspeicher geclont wird, und dieser Clone im Speicher dann zum Starten des entsprechenden Programmcodes genutzt wird.
Es werden dabei auch immer Eigenschaften von Vater auf den Sohn vererbt, zB die User uÄ, Zugriffsrechte, Prozessresourcen, globale Einstellungen, exportierten Variablen, und vieles mehr.
der Vaterprozess bekommt beim forking auch die PID vom Sohnprozess mitgeteilt und speichert diese auch in einer Tabelle und kennt praktisch zu jedem Zeitpunkt den aktuellen Ausführungsstatus (running, gestoppt, gekillt....) all seiner Söhne.

Bedeutet, jedes Programm hat dadurch genau einen einzigen Vater, und wenn der Sohnprozess stirbt oder normal endet, meldet er sich beim Vaterprozess ab und gibt dabei auch seinen Returnwert dort ab.
Stribt oder endet der Vaterprozess vorher, dann wird dabei an alle seine noch laufenden Sohnprozesse ein Signal (SIGHUP) gesendet, das all seine Sohnprozesse im Normalfall auch alle beendet wenn der Vaterprozess sich beendet.
Es gibt aber Möglichkeiten dem Sohn dazu zu bewegen, dieses Signal zu ignorieren, ein solcher Prozess würde dann aber ohne Vater weiterlaufen, das ist nicht erlaubt, und deshalb wird dieser Prozess dann beim vorzeitigen Tot des Vaters von Prozess mit der PID 1 (systemd) adoptiert und dieser ist dann der neue Vaterprozess dieses Sohnprozesses, mit all seinen Rechten und Pflichten.

Damit ist es gar nicht möglich, das irgendein Prozess einen Rückgabewert an irgend ein anderen als an seinen Vaterprozess senden kann. Das sollte deine Frage prinzipiell erstmal beantworten.
Besteht aber noch die Frage, was ist wenn ein Vater jetzt viele viele ähnliche Sohnprozesse hat und wie er jetzt erkennt welcher Sohn jetzt welchen Returnwert geliefert hat.

Dieses ist in der Tat nicht ganz so einfach und konfortabel in der Shell zu programmieren, aber es ist möglich das der Vaterprozess auch all seine Sohnprozesse in der Form überwacht, dass er auf deren Beenden wartet und dort können dann auch die Returnwerte zu den beendeten Sohnprozessen ermittelt, ausgewertet oder ausgegeben werden. Siehe dazu zB. die Manpage von wait(1p) , jobs(1), bash(1)

robi
 
Oben