Supponendo che le risposte alle mie domande di chiarimento di cui sopra siano le seguenti:
- lo script da eseguire ogni volta che viene eseguita un'applicazione specifica, indipendentemente da come o da quale processo o utente, e
- l'esecuzione dello script in modo asincrono e non bloccante (ad es. per scopi di registrazione)
... potrebbero esserci alcuni modi per farlo. Nessuno a cui riesco a pensare è terribilmente elegante o chiavi in mano e tutti richiedono una sorta di processo demonizzato in esecuzione come root che agisce per monitorare il sistema per eventi di lancio.
Monitoraggio delle exec
chiamate tramitefs_usage
Un modo possibile è creare un demone (LaunchDaemon) che viene eseguito continuamente, monitorando un fs_usage
comando in esecuzione per gli exec
eventi. È possibile visualizzare il tipo di informazioni ottenute eseguendo il comando seguente:
sudo fs_usage -f exec
Ecco la riga pertinente quando ho aperto Safari:
17:30:14.465075 posix_spawn /Applications/Safari.app/Contents/MacOS/Safari 0.000352 launchd.51630812
Ecco l'output che ho aperto eseguito open /Applications/Maps.app
dalla riga di 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
Si noti che quasi tutte le "Applicazioni" (/Applications/*.app) vengono avviate posix_spawn
da launchd
e il file utilizzato per avviarle è /Applications/FOO.app/Contents/MacOS/FOO
(dove si FOO
trova il nome dell'applicazione). Quindi, in teoria, è possibile che LaunchDaemon controlli questo comando e attivi lo script ogni volta che genera il percorso dell'app che stai monitorando:
sudo fs_usage -w -f exec | perl -lne 'm/.*posix_spawn +(.*?) +[0-9.]+ . launchd.\d+/sm && print $1'
Monitoraggio launchservicesd
tramitelsappinfo
Non ero terribilmente contento di quanto sopra perché è un po 'confuso, guardare gli eventi del filesystem invece dell'evento di lancio che li ha innescati. E poi ho capito " launchd
"! Inserisci i servizi di lancio:
Portando a:
lsappinfo listen +all forever
E Voilà, non solo hai il lancio, ma ricevi anche notifiche quando un'app si chiude. Le chiavi che ti interessano sono le seguenti:
- kLSNotifyApplicationLaunch
- kLSNotifyApplicationBirth
- kLSNotifyLaunchFinished
- kLSNotifyApplicationDeath