Tengo dos scripts que abren y cierran una aplicación; Digamos que es el incorporado Calculator.app
. El script "inicio" se usa /usr/bin/open
para 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 open
travé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?
fuente
kill
lugar de usar AppleScript?kill
okillall
. Sin embargo, todavía estoy interesado en descubrir qué está pasando y cómo hacer que la aplicación zombie desaparezca.killall
parece confiable no dejar una aplicación zombie.killall
todavía deja un zombie a veces. Entonces, mi pregunta aún necesita una respuesta.sudo killall launchservicesd
seguida desudo killall Dock
.Respuestas:
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
sudo
comandos.Una nota sobre
open
Usted mencionó que está iniciando la aplicación
open
y luego está usando AppleScript para ocultarla. Las aplicaciones con buen comportamiento deben responder al-j
indicadoropen
para lograr esto sin AppleScript, es decir:open -j -a Calculator
(consulte los
man open
detalles, como "-j Inicia la aplicación oculta"; no debe confundirse con lo-g
que significa "No traiga la aplicación al primer plano". Nunca puedo recordar cuál es cuál, por lo que casi siempre la usoopen -g -j -a Foo
cuando quiero inicie una aplicación pero no haga que se enfoque.)fuente