3 votes

Crochet de démarrage/arrêt des applications OS X

Comment faire en sorte qu'un script s'exécute automatiquement lorsque je démarre ou arrête une application sans utiliser d'outils tiers ?

Je ne développe pas l'application moi-même, c'est une question générale qui s'applique à toutes les applications installées.

Clarifications : L'application est démarrée/arrêtée par tous les moyens possibles. Le script et l'application doivent être exécutés en série.

4voto

tinytinysky Points 161

En supposant que les réponses à mes questions de clarification ci-dessus sont celles que vous voulez :

  1. le script à exécuter à tout moment une application spécifique est exécutée, indépendamment de la manière ou du processus ou de l'utilisateur, et
  2. le script à exécuter de manière asynchrone et non bloquante (par exemple, à des fins de journalisation).

...il y a peut-être quelques façons de le faire. Aucune ne me vient à l'esprit qui soit terriblement élégante ou clé en main et toutes requièrent une sorte de processus démonisé fonctionnant comme Root qui surveille le système pour les événements de lancement.

Surveillance exec appels via fs_usage

Une façon de procéder consiste à créer un démon (LaunchDaemon) qui fonctionne en permanence et surveille un système de gestion de l'information en cours d'exécution. fs_usage pour exec événements. Vous pouvez voir le type d'informations que vous obtenez en exécutant la commande suivante :

sudo fs_usage -f exec

Voici la ligne concernée lorsque j'ai ouvert Safari :

17:30:14.465075  posix_spawn    /Applications/Safari.app/Contents/MacOS/Safari    0.000352   launchd.51630812

Voici le résultat lorsque j'ai ouvert le programme open /Applications/Maps.app à partir de la ligne de commande :

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

Notez que presque toutes les "Applications" (/Applications/*.app) sont lancées par l'intermédiaire de posix_spawn par launchd et le fichier utilisé pour les lancer est /Applications/FOO.app/Contents/MacOS/FOO (où FOO est le nom de l'application). Donc, théoriquement, votre LaunchDaemon pourrait surveiller cette commande et déclencher votre script chaque fois qu'il sort le chemin de l'application que vous surveillez :

sudo fs_usage -w -f exec | perl -lne 'm/.*posix_spawn +(.*?) +[0-9.]+ . launchd.\d+/sm && print $1'

Surveillance launchservicesd via lsappinfo

Je n'étais pas très satisfait de la méthode ci-dessus parce qu'elle est un peu compliquée, car elle surveille les événements du système de fichiers au lieu de l'événement de lancement qui les a déclenchés. Et puis j'ai réalisé que " launchd " ! Entrez dans les services de lancement :

menant à :

lsappinfo listen +all forever

Et voilà, non seulement vous avez le lancement, mais vous êtes également averti lorsqu'une application s'arrête. Les clés qui vous intéressent sont les suivantes :

  • kLSNotifyApplicationLaunch
  • kLSNotifyApplicationBirth
  • kLSNotifyLaunchFinished
  • kLSNotifyApplicationDeath

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X