【问题标题】:Running Applescript: WorkFlowServiceRunner will not terminate运行 Applescript:WorkFlowServiceRunner 不会终止
【发布时间】:2013-08-27 01:21:08
【问题描述】:

我正在尝试创建一个键盘快捷键以在 OS X Mountain Lion 中启动终端。

经过一番研究,我发现我可以使用 Automator 来实现:

http://mac.tutsplus.com/tutorials/tips-shortcuts/how-to-launch-any-app-with-a-keyboard-shortcut/

它可以工作,但我注意到,每当我使用此方法启动终端时,一个名为 WorkFlowServiceRunner 的进程就会启动并且永远不会终止。更糟糕的是,当我启动更多终端(或再次通过 Automator 使用快捷方式启动不同的应用程序)多个 WorkFlowServiceRunner 进程启动并迅速耗尽内存。

我也尝试过编写自己的 AppleScript,但问题并没有消失。这显然看起来像内存泄漏。这是 OS X Automator 中的错误吗?有没有办法编写一个applescript,以便 WorkFlowServiceRunner 在完成其工作后终止(例如启动终端)? Automator 似乎是完成这项工作的最“原生”方式,我不想使用任何 3rd 方应用程序。

【问题讨论】:

  • 嗨,我看了一会儿这个问题。我最多可以同时运行两个 WorkFlowServiceRunner 实例。我使用 Activity Monitor.app 和 Unix 命令“ps aux”查看了正在运行的进程,但无法复制该问题。无论如何,我尝试通过在工作流末尾添加“运行 AppleScript”操作来修复它:“告诉当前应用程序退出”。这似乎没有什么不同。
  • 我对我的回答做了一点更新。

标签: macos applescript keyboard-shortcuts automator workflowservice


【解决方案1】:

我不时注意到这一点。

一种解决方法是使用 Cocoa-AppleScript Applet 制作您自己的服务应用程序。

这并不难。我会尽力指导你完成它。只需几分钟。

第 1 步。

打开您的应用程序 Applescript 编辑器。然后转到“文件”菜单->“从模板新建”-> Cocoa-AppleScript Applet.app

第 2 步,

将此代码粘贴到新文档中。

property NSWorkspace : class "NSWorkspace"

tell current application's NSApp to setServicesProvider_(me)
NSUpdateDynamicServices()

my runAService()
    on runAService()

            NSWorkspace's sharedWorkspace()'s launchAppWithBundleIdentifier_options_additionalEventParamDescriptor_launchIdentifier_("com.apple.Terminal", current application's NSWorkspaceLaunchDefault, missing value, missing value)

        tell me to quit
    end runAService

第 3 步,

编译
(点此编译)

保存应用。

*确保在保存对话框中未选中显示启动屏幕

为应用命名,例如 LaunchTerminal.app

第 4 步

点击文档右上角的“捆绑内容”按钮。

这将打开应用程序的内容视图。

单击“操作”按钮,然后单击“在取景器中显示”子菜单。

步骤 5,

在查找器中打开的内容文件夹中,您将看到一个文件名“info.plist”

打开 Terminal.app 并使用此文件的路径键入并运行此代码:

但请确保在 Terminal.app 中输入名称时不包含名称的“.plist”部分

 /usr/bin/defaults write /Users/YourUserNameHere/myServiceApps/LaunchTerminal.app/Contents/Info  NSServices -array-add '{NSMenuItem={default="Launch Terminal";}; NSMessage="runAService"; NSSendTypes=();}'

(您可以将文件拖放到终端以获取 posix 路径字符串) 路径部分如下所示:/Users/YourUserNameHere/myServiceApps/LaunchTerminal.app/Contents/Info

此代码应向 plist 文件添加一个数组,这是应用程序广播它具有服务的方式的一部分。

步骤 6,

再次编译并保存应用程序。

只是为了确保它接受更改。 (我发现我必须这样做,即使我不应该这样做)

步骤 7,

第一次双击应用程序运行。

应用程序将立即退出。但是第一次运行应该广播它有一个应该向系统注册的服务

步骤 8,

打开系统首选项并转到服务 -> 常规(部分)

您将看到“启动终端”服务。

照常设置您的捷径。

希望这会有所帮助..

更新:

我注意到告诉应用程序“终端”要激活。如果我之前将它们全部关闭并退出终端,则不会打开我的默认窗口组。如果我这样做了,正常的行为是打开我的默认窗口组。 (我在启动时打开了两个选项卡,每个 cd'd 到不同的路径)。

所以我已经将打开的应用程序更改为可可的方式。

一个打开/application/path/的do shell脚本。也可以。

【讨论】:

  • +1 用于展示如何以这种方式创建服务(尽管对于 OP 的问题可能有更简单的解决方案)。
  • 好帖子!辉煌可能是一个更好的描述。
【解决方案2】:

尝试使用ButlerQuicKeys。他们都有无尽的“试用期”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    相关资源
    最近更新 更多