来自AppleScript的Abort陷阱从Ruby脚本运行

时间:2012-10-24 08:51:32

标签: ruby multithreading applescript daemon daemons

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

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

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。

如果您可以将许多层次的并发症拖回现实,我将非常感谢您解决甚至调试这个奇怪案例的任何建议!

1 个答案:

答案 0 :(得分:0)

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