En supposant que les réponses à mes questions de clarification ci-dessus sont celles que vous voulez :
- 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
- 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