とりわけ、ユーザー定義のコード ブロックを実行する 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スクリプトで。
いくつもの複雑なレイヤーを現実に引き戻すことができる場合は、この奇妙なケースを解決またはデバッグするための提案をいただければ幸いです。