Suponiendo que las respuestas a mis preguntas de aclaración anteriores son las que desea:
- 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
- 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