【问题标题】:Abort trap from AppleScript run from a Ruby script从 Ruby 脚本运行的 AppleScript 中止陷阱
【发布时间】:2012-10-14 06:58:06
【问题描述】:

我有一个 Ruby 程序,除其他外,它执行用户定义的代码块(代码在 Github 上,here)。其中许多块包含系统命令,我正在尝试调试一个非常具体的案例,即在我正在调用的 bash 脚本中执行一段 AppleScript。有问题的脚本用于通过命令行和this is the code 控制 Spotify。

我遇到的问题是每次运行脚本时都会发生中止陷阱错误:

spotify: line 57: 94108 Abort trap    osascript -e 'tell application "Spotify" to pause'

这一定与进行调用的 Ruby 脚本的环境有关,但我不知道为什么。这是调用它的代码块:

# Ruby code
reaction :hello do |event|
  system "spotify pause"
  system "say 'Hello world'"
  system "spotify play"
end

当通过套接字连接触发特定事件时,此块通过yield 语句定期运行。该脚本也被守护,使用 ruby​​ gem "daemons",允许它在后台运行(但仍然作为当前用户,根据ps 和 ruby​​ 环境变量)。不仅如此,每个套接字连接都会启动一个新线程,因此代码运行在与主线程不同的线程中。

在我的调试中,我尝试在守护进程启动脚本后运行system "spotify pause" 行,没有出现问题。它在以下脚本中也可以正常运行:

Thread.new do
  system("spotify pause")
end

因此,导致问题的不是启动新线程或本身的守护进程,但它似乎是这些事情的组合,并且可能正在产生块的事实意味着正在引发中止陷阱通过 bash 脚本中的 AppleScript。

如果您可以将自己的许多层复杂化带回现实,我将不胜感激您为解决甚至调试这个奇怪的案例提供的任何建议!

【问题讨论】:

  • 我知道苹果的 api NSApplescript 不是线程安全的,因此只允许在主线程上运行。你是说这是在后台线程上运行的,所以这可能是你的问题。
  • 是的,听起来可能是这样,但奇怪的是我给出的简单线程示例有效!

标签: ruby multithreading applescript daemon daemons


【解决方案1】:

正如@regulus6633 提到的,这是由于Apple 的NSApplescript 不是线程安全的。这与守护进程相结合会导致不可预测的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    相关资源
    最近更新 更多