¿Por qué decirle a una aplicación que abandone el sistema a veces deja a un zombi y cómo puedo matarlo?

3

Tengo dos scripts que abren y cierran una aplicación; digamos que es el Calculator.app incorporado. La secuencia de comandos de "inicio" usa /usr/bin/open para iniciar la aplicación, luego un AppleScript de una línea para establecer la visibilidad de la aplicación en false . Esta es la totalidad de la secuencia de comandos "stop":

#!/bin/bash

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

Estoy ejecutando estos scripts desde un LaunchDaemon que los llama a ciertas horas fijas de la semana.

El extraño comportamiento que veo es que a veces, después de que se ejecuta el script "detener", el icono del Dock de la aplicación retiene su pequeño punto (lo que sugiere que aún se está ejecutando). Sin embargo:

  • al hacer clic con el botón derecho en el icono del Dock aparece "La aplicación no responde"
  • forzar el cierre 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 que es más desconcertante, al intentar iniciar la Calculadora de nuevo (a través de open , a través de Spotlight o haciendo doble clic en su icono) aparece un diálogo modal que dice La aplicación "Calculadora" ya no está abierta.

lsof muestra estas entradas que podrían 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 secuencia de comandos "detener" no puede hacer que la aplicación salga limpiamente?
  • Si no se reinicia, ¿hay alguna forma de que la aplicación pueda salir de este estado de zombie?
  • ¿Cómo puedo modificar mi secuencia de comandos para asegurarme de que la aplicación se cierre correctamente?
pregunta RenaissanceBug 01.03.2018 - 18:43

1 respuesta

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:

salir

He guardado el script de shell de Jon Stovell quit ( enlace de descarga directa ) desde hace varios años, y parece hacer 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 aplicación

Otra herramienta muy útil es el conmutador de aplicaciones de Nicholas ( página de GitHub ) que te permitirá hacer muchas cosas a las aplicaciones, incluso dejarlas (u ocultarlas o 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ías usar:

pkill -x Calculator

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

Una nota sobre open

Usted mencionó que está iniciando la aplicación con open y luego está usando AppleScript para ocultarlo. Las aplicaciones de buen comportamiento deben responder a la bandera -j a open para lograr esto sin AppleScript, es decir:

open -j -a Calculator

(consulte man open para obtener detalles, como "-j Lanza la aplicación oculta"; no debe confundirse con -g que significa "No llevar la aplicación al primer plano". Nunca puedo recordar cuál es cuál así que casi siempre uso open -g -j -a Foo cada vez que quiero lanzar una aplicación, pero no la tengo robada.)

    
respondido por el TJ Luoma 08.10.2018 - 06:54

Lea otras preguntas en las etiquetas