2 votos

¿Por qué al decirle a una aplicación que la abandone a veces queda un zombi, y cómo puedo matarlo?

Tengo dos scripts que abren y cierran una aplicación; digamos que es el builtin Calculator.app . El "start" script utiliza /usr/bin/open para lanzar 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 "parada" script:

#!/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 comportamiento extraño que estoy viendo es que a veces, después de que se ejecuta el script de "parada", el icono del Dock de la aplicación conserva su puntito (lo que sugiere que sigue en ejecución). Sin embargo:

  • al hacer clic con el botón derecho del ratón en el icono del Dock aparece "La aplicación no responde"
  • forzar la salida a través del menú del icono del Dock no hace nada
  • ps no muestra ningún proceso de la Calculadora en ejecución

Y, lo más desconcertante, intentar lanzar de nuevo la Calculadora (vía open , a través de Spotlight, o haciendo doble clic en su icono) produce un diálogo modal que dice La aplicación "Calculadora" ya no se abre.

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 "stop" script no puede hacer que la aplicación salga limpiamente?
  • Sin reiniciar, ¿hay alguna forma de sacar la aplicación de este estado de zombi?
  • ¿Cómo puedo modificar mi script para asegurarme de que la aplicación se cierra correctamente?

1voto

moodforaday Puntos 2633

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

dejar de

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

appwitch

Otra herramienta muy útil es la de Nicholas Riley appwitch ( Página de GitHub ) que le permitirá hacer todo un girar de cosas a las aplicaciones, incluyendo salir de ellas (u ocultarlas, o mostrar sus ventanas pero no hacerlas activas, etc).

pkill

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

pkill -x Calculator

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

Una nota sobre open

Usted mencionó que está lanzando la aplicación con open y luego usar AppleScript para ocultarlo. Las aplicaciones que se comportan bien deberían responder al -j bandera a open para lograr esto sin AppleScript, es decir:

open -j -a Calculator

(ver 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 siempre que quiera lanzar una aplicación pero que no me robe el foco).

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X