1

とりわけ、ユーザー定義のコード ブロックを実行する Ruby プログラムがあります (コードは Github にあります。こちら)。これらのブロックの多くにはシステム コマンドが含まれており、呼び出している bash スクリプト内で AppleScript の一部を実行する非常に特殊なケースをデバッグしようとしています。問題のスクリプトは、コマンド ラインで 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、特定のイベントがソケット接続を介してトリガーされると、ステートメントを介して定期的に実行されます。psスクリプトはまた、Ruby gem「daemons」を使用してデーモン化され、バックグラウンドで実行できます (ただし、ruby 環境変数に従って、現在のユーザーとして実行されます)。これだけでなく、ソケット接続ごとに新しいスレッドが開始されるため、コードはメイン スレッドとは別のスレッドで実行されます。

私のデバッグではsystem "spotify pause"、デーモンがスクリプトを起動した後に行を実行しようとしましたが、問題はありませんでした。次のスクリプトでも問題なく動作します。

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

したがって、問題の原因は新しいスレッドの開始やデーモン化自体ではありませんが、これらの組み合わせのようであり、おそらくブロックが生成されているという事実は、AppleScript によって中止トラップが発生していることを意味します。 bashスクリプトで。

いくつもの複雑なレイヤーを現実に引き戻すことができる場合は、この奇妙なケースを解決またはデバッグするための提案をいただければ幸いです。

4

1 に答える 1

0

@regulus6633 が述べたように、これは Apple の NSApplescript がスレッドセーフではないためです。これをデーモン化と組み合わせると、予期しない動作につながります。

于 2012-11-05T09:41:42.427 に答える