【问题标题】:Osascript in Yosemite broken/slow - anyone can confirm?优胜美地的 Osascript 损坏/缓慢 - 任何人都可以确认?
【发布时间】:2015-10-25 03:08:00
【问题描述】:

在 10.8 次期间,我在 Keyboard Maestro 中创建了宏,用于将网页添加到提醒列表以供以后阅读。

在 Mountain Lion 和 Maveric 中它运行良好,但在 Yosemite 中出现问题,导致执行速度非常慢。

以前的执行时间大约是 1-2 秒,现在已经超过 40 秒甚至一分钟!

Apple 团队为我提供了错误的解决方案,命令“代码签名”我的脚本,但没有代码签名的“文件”,并且可以在命令行中执行 applescripts。所以 IMO 他们在 osascript 中搞砸了一些东西,直到 10.10.4 仍然无法修复它。但我需要有人确认或建议我如何调试问题,因为我在系统控制台日志中找不到与问题相关的行。

更新: 在 El Capitan 10.11.1 问题仍然存在。

Macro

谁能测试并确认这一点?我提供了宏的链接。 它当前绑定到 F1 - 根据需要更改。在执行之前,在 OSX 的提醒中创建“2Read”列表。

【问题讨论】:

  • 您是否尝试过在 KM 之外运行 AppleScript 代码 - 例如在脚本编辑器中并通过osascript - 看看那里是否出现同样的性能问题?这应该是你缩小原因的第一步。
  • 如果您想监控 Apple 事件流量,请退出 Reminders.app,然后在新的终端窗口中运行以下命令:export AEDebugSends=1; export AEDebugReceives=1; /Applications/Reminders.app/Contents/MacOS/Reminders。然后对键盘大师做同样的事情。现在,当您在 KM 中运行脚本时,您应该会看到它们之间来回切换的所有内容。 (令人讨厌的事件在记录时没有时间戳,您将不得不通过大量的噪音和原始的四字符代码,但总比没有好。)
  • @foo 在脚本编辑器中运行相同的脚本大约需要 1-2 秒,所以它在 osascript 中一定很奇怪。接下来将尝试监控来自 KM 和提醒的流量
  • 我检查了一下,仍然没有任何线索..我无法读取此输出。也许你会比我聪明。巴斯宾:pastebin.com/WhbAE5tA

标签: macros applescript osx-yosemite


【解决方案1】:

我试过了,在我的机器上大约 1-2 秒就完成了。所以我没有遇到和你一样的问题。

我在 2013 年末 MBP Retina 上运行 OS X 10.10.4。

也许您的“2Read”列表太长了?

另一个提示:

我曾经也遇到过 Applescript 中的长列表问题。有时遍历一个列表需要几分钟,但在使用一些 if these tips 之后,列表的时间恢复到只有几秒钟。

【讨论】:

  • OP 的代码是控制 Reminders.app 的对象模型,而不是操纵 AppleScript 列表,因此这与后者众所周知的低效行为无关。 (附注:macosxautomation 中的 AppleScript 子程序完全是垃圾,即使按照 AppleScript 标准也是如此。在 macscripter.net 网站上进行挖掘是一个更好的前景,因为至少有一些机会在不可避免的渣滓中找到快速、可靠的解决方案。)跨度>
  • 我已经在空的“2Read”列表上测试过它——同样的效果。我认为这可能是由几个开发者预览更新引起的,所以我安装了 10.10.4。组合更新 - 效果相同。
【解决方案2】:

来自您的 pastebin 链接(是的,我确实警告过您它看起来像肉末):


键盘大师事件日志

(1) KM 向 Growl 发送一个 'open' 事件 ('aevt/odoc'),告诉它打开一个临时文件(大概是让 Growl 显示一条消息)

(2) 酒保向 KM 发送“获取脚本术语”事件 ('ascr/gdut')

(3) Bartender 向 KM 发送一个 'BTDR/Load' 事件,这看起来像是 Bt 告诉 KM 加载一个名为“BartenderHelperNinetyOne.bbundle”的插件

(4) KM 向某物发送一个“KeyC/KeyB”事件(它不给出进程的名称,只给出它的进程序列号,这是经典的 MacOS 等价于 Unix 进程 ID)。可能最简单的方法就是向 KM 开发人员询问该问题。

(5,6,7) KM 然后将三个“应用程序死亡”事件(“aevt/obit”)发送到 Keyboard Maestro Engine(我猜这是一个在后台持续运行的不露面的助手应用程序),通知它三个 osascript 进程(PSN 312312、315315、316316)已终止。这并不一定意味着 osascript 已经崩溃,因为这些事件包含值为 0 的错误号 ('errn') 参数,并且命令行进程通常返回错误代码 0 以指示它们已成功完成。这些很可能是 KM 和 KME 之间发送的正常内部通知,用于指示任务何时完成。第一个 osascript 进程 (PSN 312312) 与下面的提醒活动有关;另外两个我猜你是在运行其他 AppleScript 宏,可能与这里无关。

提醒事件日志

(1,2,3) PSN 312312 的 'osascript' 进程向提醒发送一个 'make' ('core/crel') 事件和两个 'set' ('core/setd') 事件,这显然是你的AppleScript 正在运行。

(4) Dock 向它发送一个“重新打开”('aevt/rapp') 事件,这可能只是您单击提醒的 Dock 图标将其带到前面。


当然,主要问题是如果没有时间戳,我无法告诉您 40 秒延迟发生在哪里。您确实需要再次执行此操作,这次手动记录每条消息的记录时间。如果你在中间某处看到一个 40 秒的延迟,应该很容易确定它在中间发生了哪些事件,这应该开始指向一个原因。此时,您最好联系 KM 供应商与他们讨论。

HTH

【讨论】:

  • 感谢您的详细回复。我尝试联系 KM 开发人员。我真的应该并排运行两个窗口,然后运行一些时钟并制作一部电影:)
猜你喜欢
  • 2014-12-16
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多