RunProgram bei OnError

Anfängerfragen zum Programmieren mit PureBasic.
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

RunProgram bei OnError

Beitrag von stevie1401 »

das Funktioniert wunderbar:

Code: Alles auswählen

i=RunProgram("gnome-terminal"," --execute ./meinProgramm","",#PB_Program_Open)   
Nun möchte ich aber, wenn mein Programm ( warum auch immer) abstürzt, dass es automatisch wieder startet.
Deshalb habe ich es in OnErrorCall(@ErrorHandler()) eingefügt.

In der ErrorHandler-Procedure wird das Programm angeblich auch aufgerufen, wenn ich einen Fehler simuliere, tatsächlich ist es aber nicht zu finden.
Wird es sofort wieder geschlossen?
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
jogo
Beiträge: 123
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint und LMDE

Re: RunProgram bei OnError

Beitrag von jogo »

wie meinst du, es ist nicht zu finden? Wenn es abstürzt, läuft es natürlich nicht mehr und ist nicht zu finden. :)
Du willst ja nur feststellen, ob es abstürzt, um es erneut zu starten.

du könntest dein Program auch direkt mit RunProgram() starten und dann mit IsProgram() und ProgramRunning() prüfen, ob es läuft. Mit KillProgram() könntest du es "gewaltsam" beenden.

Mit WriteProgramString() könntest du dem Programm auch Kommandos schicken oder auch mit AvailableProgramOutput() und ReadProgramString() Infos vom Programm empfangen. So weißt du immer, wie es dein Programm gerade "geht".

Mit den OnError Funktionen kenn ich mich nicht aus.
Aber die startest ja eigentlich das gnome-terminal, und würdest dafür die OnError-Meldung erhalten, falls mit demTerminal was nicht stimmt?
--
Ideen gibt es viele - man muss sie nur haben...
Mint / LMDE5+6 // PureBasic 6.21
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: RunProgram bei OnError

Beitrag von Macros »

Unter Linux haben Programme eine Hierarchie. Wenn dein Programm geschlossen wird oder abstürzt, werden auch davon aufgerufene Programme beendet.

Simple Demonstration:

Code: Alles auswählen

RunProgram("mousepad")
Delay(1000)
Es gibt Mittel Programme aus der Hierarchie zu lösen. So z.B. das Programm "nohup"

Ein Beispielcode:

Code: Alles auswählen

programm$="mousepad"
parameter$=~"-c \"nohup "+programm$+~" &>/dev/null &\""
If RunProgram("/bin/sh", parameter$, "")
  Debug programm$+" gestartet und unabhängig gemacht"
  Debug "Parameter waren : "+Chr(9)+parameter$
Else
  Debug programm$+" nicht gefunden/konnte nicht gestartet werden, anderes Programm einsetzen, Pfad prüfen, Rechte prüfen, ..."
EndIf

; Mousepad sollte weiter im Hintergrund laufen
End
Das sollte dann auch in deiner OnError funktionieren, das hab ich auf die Schnelle nicht getestet.
(Hinweis: Es erscheint mir ein schlechter Programmierstil, bei einem Fehler das eigene Programm neuzustarten, von wenigen Ausnahmen wie einem Webserver mal abgesehen. Generell sollte man eher untersuchen was den Fehler verursacht hat und beenden, damit keine Folgefehler entstehen)

Warum nicht einfach

Code: Alles auswählen

RunProgram("nohup", programm$, "")
?

Weil nohup sonst eine Datei nohub.out im aktuellen Verzeichnis erzeugt und dort die Programmausgabe hineinschreibt, dass hab ich schnell mit einem Shell redirect behoben. Es mag bessere Programme für die Aufgabe geben, nohup war mir bekannt und ist praktisch immer vorhanden. Wenn du eine bessere Lösung findest, poste sie gerne hier.
Bild
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: RunProgram bei OnError

Beitrag von stevie1401 »

Erst einmal vielen Dank, ich werde es testen.
Und du hast Recht, es ist ein schlechter Programmierstil ein abgestürztes Programm neu aufzurufen.
Aber es ist tatsächlich ein Webserver und ich finde den Fehler einfach nicht.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: RunProgram bei OnError

Beitrag von stevie1401 »

wenn ich meinem Programm mit WriteProgramString() etwas schreibe, wie liest mein Programm dann das Geschriebene? Anscheinend nicht mit ReadProgramString()
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Antworten