Absturzsicherung



  • Guten Tag meine Kollegen,
    ich suche eine preventief Maßnahme für Abstürze.

    In diesem Zusammenhang frage ich ob es eine Möglichkeit gibt, das wenn mein Programm abstürz, es gleich neugestartet wird, also vom Betriebssystem, wie es beim Explorer der Fall ist.

    Ich hoffe ihr könnt mir helfen, danke.



  • Nachdem du Explorer schreibst nehme ich mal an du willst ne Antwort für Windows.

    In dem Fall gibt es die Möglichkeit dein Programm als Service laufen zu lassen. Das muss dein Programm entweder selbst unterstützen, oder du musst ein Hilfsprogramm verwenden welches den "Service sein" Teil übernimmt, und dann ein anderes Programm (dein Programm) rausstartet.

    Dabei kann das Programm aber nur sehr begrenzt auf den Desktop zugreifen.

    Falls es sich um eine Desktopanwendung handelt würde ich also eher nach alternativen suchen. Eine Möglichkeit wäre vermutlich einen Scheduled Task mit folgenden Eigenschaften einzurichten:
    - Wird jede Minute ausgeführt (ggf. auch öfter - k.A. wie hoch man die Frequenz einstellen kann)
    - Startet dein Programm
    - Ist auf "nicht noch einen Instanz starten wenn der Task schon läuft" eingestellt

    Möglicherweise geht es auch noch besser/direkter mit Scheduled Tasks. Einfach mal aufmachen und gucken was man da alles einstellen kann.



  • Danke für die Antwort, aber wenn ich dich richtig versehe, gibt es kein Möglichkeit das zu realisieren, in dem man es in die Registry oder in das Programm manifest was einträgt.

    Ist das korrekt?



  • FrankenDerStein schrieb:

    Guten Tag meine Kollegen,
    ich suche eine preventief Maßnahme für Abstürze.

    In diesem Zusammenhang frage ich ob es eine Möglichkeit gibt, das wenn mein Programm abstürz, es gleich neugestartet wird, also vom Betriebssystem, wie es beim Explorer der Fall ist.

    Ich hoffe ihr könnt mir helfen, danke.

    Du könntest z.B. "Windows Exceptions" (nicht zu verwechseln mit C++ Exceptions) einsetzen, um dein Programm sich im Crash-Fall selbst neu starten zu lassen. Hier weiterlesen: https://msdn.microsoft.com/en-us/library/windows/desktop/ms680657(v=vs.85).aspx



  • FrankenDerStein schrieb:

    Danke für die Antwort, aber wenn ich dich richtig versehe, gibt es kein Möglichkeit das zu realisieren, in dem man es in die Registry oder in das Programm manifest was einträgt.

    Ist das korrekt?

    Korrekt.
    Mir war nicht klar dass das ganze per Installer konfiguriert werden soll.

    Eine "nicht-vollständige" Lösung wäre in deinem Programm einen Crash-Handler zu registrieren. Im Crash-Handler kannst du dann eine weitere Instanz deines Programms starten, und die erste Instanz danach beenden. Damit kann man viele Fälle abdecken, aber es ist nicht 100% sicher.

    Wobei genaugenommen natürlich nichts 100% sicher ist.
    Die beste Sicherheit würde aber vermutlich mit einem Hilfsprozess erreicht, der dein Programm überwacht. Da könnte man dann auch sowas wie nen Watchdog-Timer realisieren, damit das Programm auch neu gestartet wird wenn es einfach hängen bleibt (ohne zu crashen).

    Aber, bevor wir hier noch weiter rumraten: worum geht's eigentlich? Also was für eine Art von Programm willst du gegen Crashes "schützen", und warum crasht das Teil überhaupt?



  • Danke für ihre antworten.
    Es geht um ein Programm das als Schnittstelle dient für einen Webserver, und lädt Daten auf spezielle COM Geräte.
    Dieses Programm läuft 24/7 durch.
    Dieses Programm wurde in C# als Konsolenanwendung geschrieben.
    Das Programm lässt sich auch nur im Administrator Modus starten.

    Nun die Software läuft schon einige tage bis ein Kollegen festgestellt hat, das dass Programm abgestürzt ist, mit dem Fehlercode 0xc0000005.
    Im Normal Fall wäre bei einem Fehler ein Eintrag im Log zu finden, aber dem war nicht so, nun suche ich eine Lösung um auf solche Ereignisse zu reagieren.



  • Dann bau das Programm zu nem Service um.
    Visual Studio hat ein "Windows Service" Template für C#. Damit einfach ein neues Projekt bauen, und den Code aus dem alten Projekt rüberschieben. Sollte in ein paar Minuten erledigt sein.
    Dann noch Trace und Console in ein Logfile schreiben, und schwupps hast du ein hübsches Service mit Logging und allem.

    Installieren kannst du das einfach mit dem Utility sc.exe (Teil von Windows).

    Und dann kannst du einfach über die Service-Einstellungen (schön mit klickibunti Dialog) konfigurieren dass Windows das Ding neu starten soll wenn es crasht.

    Ich würde sowieso empfehlen das als Service zu machen - ne normale Anwendung ist nicht so toll für Sachen die 24/7 laufen sollen. z.B. schonmal weil die dann nicht automatisch mit dem PC mit startet.
    Und wenn man sich den Output von dem Service "live" ansehen will, kann man ja "tail" oder ähnlche Tools verwenden um das Logfile (bzw. irgend ein Output-File) ständig zu überwachen.



  • Nun die Software läuft schon einige tage bis ein Kollegen festgestellt hat, das dass Programm abgestürzt ist, mit dem Fehlercode 0xc0000005.
    Im Normal Fall wäre bei einem Fehler ein Eintrag im Log zu finden, aber dem war nicht so, nun suche ich eine Lösung um auf solche Ereignisse zu reagieren.

    Ohne jetzt klug-zu-scheissen , aber sollte man nich erst mal schaun wieso das Programm abstürzt? aus wenn es nervt das Problem zu finden...^^ 😃



  • NullBockException schrieb:

    Ohne jetzt klug-zu-scheissen , aber sollte man nich erst mal schaun wieso das Programm abstürzt? aus wenn es nervt das Problem zu finden...^^ 😃

    👍



  • Klar.
    Trotzdem kann es oft Sinn machen einen Notnagel zu haben.
    z.B. wenn man den Fehler nicht so schnell finden kann wie man eine Lösung braucht.

    Wenn es keine Möglichkeit gäbe Windows Services nach einem Crash automatisch neu starten zu lassen hätten wir schon ein paar mal ziemlich doof aus der Wäsche geschaut. (Bzw. uns vermutlich selbst ein Tool zur Überwachung gebastelt.)
    Weil "warten bis der Fehler behoben ist" halt einfach oft nicht praktikabel ist. Also ohne jetzt klug-zu-scheissen...



  • Kann man unter Linux übrigens auch mit systemd machen. Das Modul heißt watchdog und das sind nur wenige Zeilen Code:

    http://stackoverflow.com/questions/32947606/calling-a-sd-notify0-watchdog-1-in-a-service

    http://0pointer.de/blog/projects/watchdog.html


Anmelden zum Antworten