Supponendo che le risposte alle mie domande di chiarimento sopra siano quelle che desideri:
- lo script per eseguire in qualsiasi momento viene eseguita un'applicazione specifica, indipendentemente da come o da quale processo o utente, e
- lo script da eseguire in modo asincrono e non bloccante (ad esempio per scopi di registrazione)
... potrebbero esserci alcuni modi per farlo. Nessuno a cui posso pensare è terribilmente elegante o chiavi in mano e tutti richiedono una sorta di processo demonizzato eseguito come root che agisce per monitorare il sistema per gli eventi di avvio.
Monitoraggio exec
chiamate tramite fs_usage
Un modo possibile è creare un daemon (LaunchDaemon) che funzioni continuamente, monitorando un comando fs_usage
in esecuzione per exec
eventi. Puoi vedere il tipo di informazioni ottenute eseguendo il seguente comando:
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 quando ho aperto il percorso 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
Nota che quasi tutte le "Applicazioni" (/Applications/*.app) vengono lanciate tramite posix_spawn
da launchd
e il file utilizzato per avviarle è /Applications/FOO.app/Contents/MacOS/FOO
(dove FOO
è il nome dell'applicazione). Quindi, teoricamente, potresti avere il tuo LaunchDaemon che monitora questo comando e attiva lo script ogni volta che emette 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
tramite lsappinfo
Non ero molto contento di quanto sopra, perché è un po 'hacky, che osserva gli eventi del filesystem invece dell'evento di lancio che li ha attivati. E poi ho capito, " launchd
"! Inserisci i servizi di avvio:
che precede:
lsappinfo listen +all forever
E Voilà, non solo ti stai avviando, ma ricevi anche una notifica quando un'app si chiude. Le chiavi che ti interessano sono le seguenti:
- kLSNotifyApplicationLaunch
- kLSNotifyApplicationBirth
- kLSNotifyLaunchFinished
- kLSNotifyApplicationDeath