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.