¿Por qué decirle a una aplicación que se cierre a veces deja un zombie, y cómo puedo matarlo?

3

Tengo dos scripts que abren y cierran una aplicación; Digamos que es el incorporado Calculator.app. El script "inicio" se usa /usr/bin/openpara iniciar la aplicación, luego un AppleScript de una línea para configurar la visibilidad de la aplicación false. Esta es la totalidad del script "stop":

#!/bin/bash

osascript -e 'tell app "Calculator" to quit'

Estoy ejecutando estos scripts desde un LaunchDaemon que los llama en ciertos momentos fijos de la semana.

El comportamiento extraño que estoy viendo es que a veces, después de que se ejecuta el script "detener", el ícono Dock de la aplicación conserva su pequeño punto (lo que sugiere que todavía se está ejecutando). Sin embargo:

  • Al hacer clic con el botón derecho en el icono del Dock, se muestra "La aplicación no responde"
  • el cierre forzado a través del menú del icono del Dock no hace nada
  • ps no muestra ningún proceso de Calculadora en ejecución

Y, lo más desconcertante, intentar volver a iniciar Calculator (a opentravés de Spotlight o al hacer doble clic en su icono) produce un diálogo modal que dice que la aplicación "Calculator" ya no está abierta.

lsof muestra estas entradas que pueden estar relacionadas:

COMMAND     PID   USER   FD     TYPE             DEVICE   SIZE/OFF     NODE NAME
Spotlight   443 jteach   54r     DIR                1,4        102 28977573 /Applications/Calculator.app
Notificat   476 jteach  txt      REG                1,4      37933 29214948 /System/Library/Frameworks/NotificationCenter.framework/PlugIns/com.apple.ncplugin.calculator.appex/Contents/Resources/Assets.car
Notificat   476 jteach    8r     REG                1,4      37933 29214948 /System/Library/Frameworks/NotificationCenter.framework/PlugIns/com.apple.ncplugin.calculator.appex/Contents/Resources/Assets.car

Mis preguntas:

  • ¿Por qué mi script "stop" no puede hacer que la aplicación salga limpiamente?
  • A falta de reiniciar, ¿hay alguna manera de sacar la aplicación de este estado zombie?
  • ¿Cómo puedo modificar mi script para asegurarme de que la aplicación se cierra correctamente?
RenacimientoBug
fuente
1
Ya que de todos modos está usando bash, ¿ha pensado usar en killlugar de usar AppleScript?
CJK
2
Gracias por la sugerencia. Estaba pensando que intentaría usar killo killall. Sin embargo, todavía estoy interesado en descubrir qué está pasando y cómo hacer que la aplicación zombie desaparezca.
RenaissanceBug
1
Para el registro, el uso killallparece confiable no dejar una aplicación zombie.
RenaissanceBug
Corrección: No, killalltodavía deja un zombie a veces. Entonces, mi pregunta aún necesita una respuesta.
RenaissanceBug
1
Actualización: esta pregunta tiene una respuesta que proporciona una forma de trabajo para matar a los zombies: sudo killall launchservicesdseguida de sudo killall Dock.
RenaissanceBug

Respuestas:

1

Parece que ha encontrado una solución a su problema, pero en caso de que otros estén buscando más herramientas para su cinturón de herramientas Unix-y, aquí hay algunas:

dejar

He mantenido el guión de shell de Jon Stovell para salir ( enlace de descarga directa ) durante varios años, y parece que hace un muy buen trabajo al salir de las aplicaciones. Intenta una variedad de métodos e intentará permitir que una aplicación "guarde los cambios" si es necesario.

interruptor de aplicaciones

Otra herramienta muy útil es el conmutador de aplicaciones de Nicholas Riley ( página de GitHub ) que le permitirá hacer una gran cantidad de cosas a las aplicaciones, incluso cerrarlas (u ocultarlas, mostrar sus ventanas pero no activarlas, etc.).

pkill

killall ya se ha mencionado, pero sería negligente si no añadiera que también podría usar:

pkill -x Calculator

para deshacerse de la aplicación molesta. No he visto "zombies en el muelle", así que no puedo saber si eso solucionaría o no el problema, pero si lo hace, podría ser preferible a dos sudocomandos.

Una nota sobre open

Usted mencionó que está iniciando la aplicación openy luego está usando AppleScript para ocultarla. Las aplicaciones con buen comportamiento deben responder al -jindicador openpara lograr esto sin AppleScript, es decir:

open -j -a Calculator

(consulte los man opendetalles, como "-j Inicia la aplicación oculta"; no debe confundirse con lo -gque significa "No traiga la aplicación al primer plano". Nunca puedo recordar cuál es cuál, por lo que casi siempre la uso open -g -j -a Foocuando quiero inicie una aplicación pero no haga que se enfoque.)

TJ Luoma
fuente