Shell script para reiniciar un determinado proceso si no responde

Necesito una aplicación java para ejecutar 24/7 en mi mac. Desafortunadamente, el proceso JVM a veces se atasca y, por lo tanto, la aplicación Java ya no responde.

¿Existe la posibilidad de detectar si un proceso determinado se ha bloqueado (o al menos no se encuentra en un estado de ejecución adecuado) y reiniciar este proceso específico posteriormente?

encontré

ps aux|grep java

que enumera el proceso java ( /usr/bin/java)

Ahora necesito saber cómo ver los códigos de estado del proceso y cómo reiniciar este proceso en particular, por ejemplo, en un script de shell.

Por cierto, el estado del proceso es Tlo que significa detenido por lo que yo sé.

EDITAR: Lamentablemente, cuatro sugerencias no funcionaron en mi máquina. Configuré un agente global y el jar se está iniciando correctamente, pero el proceso aún falla después de un cierto período de tiempo. Por extraño que parezca, el proceso en el monitor de actividad no está marcado como que no responde, mientras que el menú contextual del elemento del muelle sí lo hace (ver figura)ingrese la descripción de la imagen aquí

¿Escribió la aplicación Java y puede explicar cómo sabe que no responde, desde la interfaz gráfica de usuario o de alguna otra manera? Por cierto, T no significa que esté atascado, significa que un usuario ha dejado de ejecutarlo o que está siendo rastreado.
No, la aplicación java es solo un .jar esclavo de jenkins ordinario que ejecuta algunos trabajos de compilación controlados por el servidor CI maestro de jenkins. Cuando el maestro de jenkins no puede conectarse a su esclavo, inicio sesión en mac y Activity Monitor.app me muestra que el proceso del esclavo de jenkins no responde.
¿Hay un registro de compilación y puedes publicar una parte? Puede ser mejor averiguar por qué se está atascando y arreglarlo en su lugar. Alternativamente, si el registro tiene una marca de tiempo, es posible que pueda determinar si está atascado por cuánto tiempo ha pasado desde el último evento...?!

Respuestas (3)

Mire el launchctlque es una interfaz para launchddaemon.

La tarea principal de este demonio es cuidar de todos los demonios del sistema y de los usuarios. Este cuidado incluye la posibilidad de reiniciar un demonio cada vez que se cierra o falla.

Para empezar, te aconsejo que leas:

man launchd
man launchctl

Luego, eche un vistazo a uno de los plistarchivos más simples utilizados por el sistema para ayudarlo a escribir uno propio para inspeccionar JVM y reinícielo si es necesario:

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

Use LaunchD, es lo que Mac OS X usa para ejecutar y monitorear programas. Deberá crear un archivo LaunchAgent o LaunchDaemon, y puede especificar que debe eliminarse y reiniciarse si alcanza el estado T.

Con "especificar que debe eliminarse y reiniciarse...", ¿te refieres a KeepAlive->true?
@Mahatma_Fatal_Error: exactamente, este es el significado de este booleano.

Una forma tal vez usando applescript como se muestra aquí . Otro tal vez por la herramienta de secuencias de comandos sikuli.

Sikuli observa tu pantalla y puede responder según lo que ve. Entonces, si se encuentra Not Respondingen la pantalla, se puede programar para que actúe.

Aquí hay un hilo que discute un problema similar al suyo que también proporciona el siguiente script como solución a su problema. El sitio web de sikuli tiene toda la documentación que necesita. Buena suerte.

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