Enganche de inicio / parada de la aplicación OS X

3

¿Cómo puedo ejecutar un script automáticamente cuando inicio o detengo una aplicación sin usar herramientas de terceros?

No estoy desarrollando la aplicación, es una pregunta general que se aplica a cualquier aplicación instalada.

Aclaraciones: la aplicación se inicia / sale de cualquier modo posible. El script y la aplicación deben ejecutarse en serie.

    
pregunta dandu 25.01.2014 - 00:40

1 respuesta

4

Suponiendo que las respuestas a mis preguntas de aclaración anteriores son las que desea:

  1. el script para ejecutar en cualquier momento se ejecuta una aplicación específica, independientemente de cómo o por qué proceso o usuario, y
  2. la secuencia de comandos se ejecuta de forma asíncrona, sin bloqueo (por ejemplo, para fines de registro)

... puede haber algunas maneras de hacerlo. No se me ocurre que ninguno sea terriblemente elegante o llave en mano y todos requieren algún tipo de proceso demonizado que se ejecute como root y que actúe para supervisar el sistema en busca de eventos de lanzamiento.

Monitoreo de llamadas de exec a través de fs_usage

Una forma posible es crear un demonio (LaunchDaemon) que se ejecute continuamente, monitoreando un comando fs_usage en ejecución para los eventos exec . Puede ver el tipo de información que obtiene ejecutando el siguiente comando:

sudo fs_usage -f exec

Aquí está la línea relevante cuando abrí Safari:

17:30:14.465075  posix_spawn    /Applications/Safari.app/Contents/MacOS/Safari    0.000352   launchd.51630812

Aquí está la salida cuando abrí ejecuté open /Applications/Maps.app desde la línea de comando:

17:35:51.594849  execve       /usr/bin/open                                 0.003680 W bash.51635318
17:35:51.642212  posix_spawn  /Applications/Maps.app/Contents/MacOS/Maps    0.003158 W launchd.51635324

Tenga en cuenta que casi todas las "Aplicaciones" (/Aplicaciones/*.app) se inician a través de posix_spawn by launchd y el archivo utilizado para iniciarlas es /Applications/FOO.app/Contents/MacOS/FOO (donde FOO es el nombre de la aplicación). Por lo tanto, teóricamente, podría hacer que su LaunchDaemon controle este comando y active su secuencia de comandos cada vez que muestre la ruta de acceso a la aplicación que está supervisando:

sudo fs_usage -w -f exec | perl -lne 'm/.*posix_spawn +(.*?) +[0-9.]+ . launchd.\d+/sm && print $1'

Monitoreando launchservicesd a través de lsappinfo

No estaba terriblemente feliz con lo anterior porque es un poco intrépido, observar los eventos del sistema de archivos en lugar del evento de lanzamiento que los activó. Y luego me di cuenta, " launchd "! Entrar en Servicios de lanzamiento:

Llevando a:

lsappinfo listen +all forever

Y Voilà, no solo tiene el lanzamiento, sino que también recibe notificaciones cuando se cierra una aplicación. Las claves que te interesan son las siguientes:

  • kLSNotifyApplicationLaunch
  • kLSNotifyApplicationBirth
  • kLSNotifyLaunchFinished
  • kLSNotifyApplicationDeath
respondido por el Jay Allen 25.01.2014 - 05:52

Lea otras preguntas en las etiquetas