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).
Sehen Sie sich das an launchctl
, das eine Schnittstelle zum launchd
Daemon 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 plist
Dateien, 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.
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 Responding
auf 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()
Vic
Mahatma_Fatal_Error
Vic