Suponiendo que las respuestas a mis preguntas de aclaración de arriba son los que usted desea:
- la secuencia de comandos para ejecutar en cualquier momento específico de la aplicación que se ejecuta, independientemente de cómo o por qué proceso o usuario, y
- la secuencia de comandos para ejecutar en un asincrónica, sin bloqueo (por ejemplo, para propósitos de registro)
...puede ser un par de maneras de hacerlo. Ninguno que se me ocurre son terriblemente elegante o llave en mano y todos requieren algún tipo de endemoniado proceso que se ejecuta como root que actuar para supervisar el sistema de eventos de lanzamiento.
Monitorización exec
llamadas a través de fs_usage
Una manera posible es crear un demonio (LaunchDaemon) que se ejecuta de forma continua, la supervisión de una ejecución fs_usage
comando para exec
eventos. Usted puede ver el tipo de información que se obtiene ejecutando el siguiente comando:
sudo fs_usage -f exec
Aquí está la línea correspondiente al abrir Safari:
17:30:14.465075 posix_spawn /Applications/Safari.app/Contents/MacOS/Safari 0.000352 launchd.51630812
Aquí está la salida, cuando me abrió corrió open /Applications/Maps.app
desde la línea de comandos:
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) son lanzadas a través de la posix_spawn
por launchd
y el archivo que se utiliza para el lanzamiento de ellas es /Applications/FOO.app/Contents/MacOS/FOO
(donde FOO
es el nombre de la aplicación). Por lo tanto, teóricamente, podría tener su LaunchDaemon la vigilancia de este comando y la activación de su secuencia de comandos cada vez que se emite la ruta de acceso de la aplicación con la que estamos de monitoreo:
sudo fs_usage -w -f exec | perl -lne 'm/.*posix_spawn +(.*?) +[0-9.]+ . launchd.\d+/sm && print $1'
Monitorización launchservicesd
través lsappinfo
Yo no era muy feliz con la anterior, porque es un poco chapucero, observando el sistema de archivos de eventos en lugar de el evento de lanzamiento que los provocó. Y entonces me di cuenta, "launchd
"! Introduzca Servicios De Lanzamiento:
Lo que conduce a:
lsappinfo listen +all forever
Y Voilà, no sólo han de lanzamiento, pero también recibe una notificación cuando una aplicación se cierra. Las claves que te importa son los siguientes:
- kLSNotifyApplicationLaunch
- kLSNotifyApplicationBirth
- kLSNotifyLaunchFinished
- kLSNotifyApplicationDeath