Shell-Skript zum Neustarten eines bestimmten Prozesses, wenn er nicht antwortet

Ich brauche eine Java-Anwendung, die rund um die Uhr auf meinem Mac läuft. Leider bleibt der JVM-Prozess manchmal hängen und die Java-Anwendung reagiert nicht mehr.

Gibt es eine Möglichkeit zu erkennen, ob ein bestimmter Prozess abgestürzt ist (oder sich zumindest nicht in einem ordnungsgemäßen Betriebszustand befindet) und diesen spezifischen Prozess anschließend neu zu starten?

ich fand

ps aux|grep java

die den Java-Prozess auflistet ( /usr/bin/java)

Jetzt muss ich wissen, wie man die Prozesszustandscodes überwacht und wie man diesen bestimmten Prozess in zB einem Shell-Skript neu startet.

Übrigens, der Prozessstatus ist T, was meines Wissens nach gestoppt bedeutet.

EDIT: Leider haben vier Vorschläge auf meiner Maschine nicht funktioniert. Ich habe einen globalen Agenten konfiguriert und das JAR startet ordnungsgemäß, aber der Prozess schlägt nach einer bestimmten Zeit immer noch fehl. Seltsamerweise ist der Prozess in der Aktivitätsanzeige nicht als nicht reagierend markiert, das Kontextmenü des Dock-Elements hingegen schon (siehe Abbildung).Geben Sie hier die Bildbeschreibung ein

Haben Sie die Java-App geschrieben und können Sie anhand der GUI oder auf andere Weise erklären, woher Sie wissen, dass sie nicht reagiert? Übrigens bedeutet T nicht, dass es feststeckt, es bedeutet, dass es von einem Benutzer nicht mehr ausgeführt wird oder verfolgt wird.
Nein, die Java-App ist nur eine gewöhnliche JENKINS-Slave-JAR-Datei, die einige Build-Jobs ausführt, die vom Jenkins-Master-CI-Server gesteuert werden. Wenn der Jenkins-Master keine Verbindung zu seinem Slave herstellen kann, melde ich mich beim Mac an und Activity Monitor.app zeigt mir, dass der Jenkins-Slave-Prozess nicht antwortet.
Gibt es ein Bauprotokoll und kannst du ein Stück davon posten? Es ist möglicherweise am besten, herauszufinden, warum es hängen bleibt, und das stattdessen zu beheben. Wenn das Protokoll alternativ mit einem Zeitstempel versehen ist, können Sie möglicherweise feststellen, ob es daran hängt, wie lange es seit dem letzten Ereignis vergangen ist ...?!

Antworten (3)

Sehen Sie sich das an launchctl, das eine Schnittstelle zum launchdDaemon ist.

Die Hauptaufgabe dieses Daemons besteht darin, sich um alle System- und Benutzerdaemons zu kümmern. Diese Sorgfalt schließt die Möglichkeit ein, einen Daemon neu zu starten, wenn er beendet wird oder abstürzt.

Zu Beginn empfehle ich Ihnen zu lesen:

man launchd
man launchctl

Dann werfen Sie einen Blick auf eine der einfachsten plistDateien, die vom System verwendet werden, um Ihnen beim Schreiben Ihrer eigenen zu helfen, um JVM zu überprüfen und bei Bedarf neu zu starten:

/System/Library/LaunchDaemons/com.apple.autofsd.plist

Verwenden Sie LaunchD, es ist das, was Mac OS X selbst zum Ausführen und Überwachen von Programmen verwendet. Sie müssen eine LaunchAgent- oder LaunchDaemon-Datei erstellen, und Sie können angeben, dass sie beendet und neu gestartet werden soll, wenn sie den T-Zustand erreicht.

Mit "geben Sie an, dass es beendet und neu gestartet werden soll ..." meinen Sie KeepAlive->true?
@Mahatma_Fatal_Error: Genau, das ist die Bedeutung dieses booleschen Werts.

Ein Weg vielleicht mit Applescript wie hier gezeigt . Ein anderer vielleicht durch das Scripting-Tool sikuli.

Sikuli beobachtet Ihren Bildschirm und kann basierend auf dem, was es sieht, reagieren. Wenn es also Not Respondingauf dem Bildschirm gefunden wird, kann es per Skript ausgeführt werden.

Hier ist ein Thread, der ein ähnliches Problem wie Ihres diskutiert und auch das folgende Skript als Lösung für ihr Problem enthält. Auf der sikuli- Website finden Sie alle erforderlichen Unterlagen. Viel Glück.

while True:

def Kill(e):

openApp("/Users/Admin/Desktop/KillPrintSmith.app")

def Open(e):

openApp("/Applications/PrintSmith WS Folder/PrintSmith WS.app")

onAppear(#screenshot of Not Responding Text#,Kill)

onVanish(#screenshot of Printsmith dock icon#,Open)

observe()