Gancio di avvio / arresto dell'applicazione OS X.


3

Come posso eseguire automaticamente uno script all'avvio o all'arresto di un'app 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 viene avviata / uscire da qualsiasi mezzo possibile. Lo script e l'applicazione devono essere eseguiti in serie.


Per quanto ne so, non puoi. È facile da fare con Keyboard Maestro ma non conosco alcun modo per farlo senza software di terze parti.
— TJ Luoma,

Due domande di chiarimento poiché in realtà non hai detto PERCHÉ potresti voler fare questo: 1) Sei interessato a far eseguire lo script SOLO quando avvii / chiudi un'app tramite Finder, Dock, launcher, ecc. O vorresti da eseguire IN QUALSIASI MOMENTO, un'applicazione viene avviata o chiusa con qualsiasi mezzo e qualsiasi utente? 2) Desideri che questo script venga eseguito PRIMA e quindi l'app, in serie, o venga eseguita in modo asincrono (ad esempio per scopi di registrazione).
— Jay Allen,

È un'app specifica o tutte le app?
— Tony Williams,

Risposte:


4

Supponendo che le risposte alle mie domande di chiarimento di cui sopra siano le seguenti:

  1. lo script da eseguire ogni volta che viene eseguita un'applicazione specifica, indipendentemente da come o da quale processo o utente, e
  2. 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 execchiamate tramitefs_usage

Un modo possibile è creare un demone (LaunchDaemon) che viene eseguito continuamente, monitorando un fs_usagecomando in esecuzione per gli execeventi. È 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.appdalla 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_spawnda launchde il file utilizzato per avviarle è /Applications/FOO.app/Contents/MacOS/FOO(dove si FOOtrova 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 launchservicesdtramitelsappinfo

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.