OS X应用程序启动/停止挂钩


3

如何在不使用第三方工具的情况下启动或停止应用程序时自动运行脚本?

我不是自己开发应用程序,这是一个适用于任何已安装应用程序的一般性问题。

说明:应用程序已启动/退出可能的任何方式。脚本和应用程序应该是串行运行的。


据我所知,你做不到。使用Keyboard Maestro很容易完成,但我不知道没有第三方软件可以做任何事情。
TJ Luoma 2014年

两个澄清的问题,因为你没有真正说出为什么你可能想要这样做:1)你是否有兴趣让你的脚本只在你通过Finder,Dock,启动器等启动/退出应用程序时运行,或者你想要它运行ANYTIME应用程序启动或退出任何方式和任何用户?2)您希望此脚本首先运行,然后是应用程序,串行运行,或者只是异步运行(例如,用于记录目的)。
Jay Allen

是一个特定的应用程序或所有应用程序?
托尼·威廉姆斯

Answers:


4

假设上述澄清问题的答案是你想要的:

  1. 脚本运行随时随地特定的应用程序运行,不管如何或通过什么程序或用户,并
  2. 脚本以异步,非阻塞方式运行(例如,用于记录目的)

......可能有几种方法可以做到这一点。没有我能想到的非常优雅或交钥匙,并且都需要某种以root身份运行的妖魔化进程,这些进程用于监视系统的启动事件。

exec通过监控来电fs_usage

一种可能的方法是创建一个持续运行的守护进程(LaunchDaemon),监视事件的运行fs_usage命令exec。您可以通过运行以下命令来查看获得的信息类型:

sudo fs_usage -f exec

这是我打开Safari时的相关行:

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

这是我open /Applications/Maps.app从命令行打开时的输出:

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

请注意,几乎所有“应用程序”(/Applications/*.app)都是通过它启动posix_spawnlaunchd,用于启动它们的文件是/Applications/FOO.app/Contents/MacOS/FOOFOO应用程序的名称)。因此,从理论上讲,您可以让LaunchDaemon监视此命令,并在输出您正在监视的应用程序的路径时触发您的脚本:

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

launchservicesd通过监控lsappinfo

我对上面的内容并不十分满意,因为它有点hacky,看着文件系统事件而不是触发它们的启动事件。然后我意识到,“ launchd”!输入启动服务:

导致:

lsappinfo listen +all forever

而且,Voilà,您不仅可以启动,还可以在应用程序退出时收到通知。您关心的关键如下:

  • kLSNotifyApplicationLaunch
  • kLSNotifyApplicationBirth
  • kLSNotifyLaunchFinished
  • kLSNotifyApplicationDeath
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.