Hook di avvio / arresto dell'applicazione OS X

3

Come posso far funzionare automaticamente uno script quando avvio o fermo un'applicazione senza utilizzare strumenti di terze parti?

Non sto sviluppando l'applicazione da solo, è una domanda generale che si applica a qualsiasi app installata.

Chiarimenti: l'applicazione è avviata / abbandona qualsiasi mezzo possibile. Lo script e l'applicazione devono essere eseguiti in serie.

    
posta dandu 25.01.2014 - 00:40
fonte

1 risposta

4

Supponendo che le risposte alle mie domande di chiarimento sopra siano quelle che desideri:

  1. lo script per eseguire in qualsiasi momento viene eseguita un'applicazione specifica, indipendentemente da come o da quale processo o utente, e
  2. 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
risposta data 25.01.2014 - 05:52
fonte

Leggi altre domande sui tag