Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

Exit Code in eine Variable schreiben

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

Antworten
bunter fisch
Member
Member
Beiträge: 101
Registriert: 12. Sep 2017, 10:25

Exit Code in eine Variable schreiben

Beitrag von bunter fisch » 9. Apr 2019, 17:56

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: Alles auswählen

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?

Werbung:

bunter fisch
Member
Member
Beiträge: 101
Registriert: 12. Sep 2017, 10:25

Re: Exit Code in eine Variable schreiben

Beitrag von bunter fisch » 9. Apr 2019, 20:29

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?

Benutzeravatar
framp
Moderator
Moderator
Beiträge: 4287
Registriert: 6. Jun 2004, 20:57
Wohnort: bei Stuttgart
Kontaktdaten:

Re: Exit Code in eine Variable schreiben

Beitrag von framp » 9. Apr 2019, 20:39

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 :(

abgdf
Guru
Guru
Beiträge: 3175
Registriert: 13. Apr 2004, 21:15

Re: Exit Code in eine Variable schreiben

Beitrag von abgdf » 9. Apr 2019, 21:53

Sicherheitshalber könnte Dein Skript seinen Exit-Code in eine eindeutige Datei schreiben.

drcux
Hacker
Hacker
Beiträge: 388
Registriert: 9. Aug 2005, 12:14

Re: Exit Code in eine Variable schreiben

Beitrag von drcux » 10. Apr 2019, 21:22

Oder gleich in eine Variable schreiben:

Code: Alles auswählen

lsexitcode=$(ls -l > /dev/null)$?

Benutzeravatar
robi
Moderator
Moderator
Beiträge: 3163
Registriert: 25. Aug 2004, 02:13

Re: Exit Code in eine Variable schreiben

Beitrag von robi » 13. Apr 2019, 00:56

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

Antworten