2012-10-24 5 views
1

다른 것들 중에서도 사용자 정의 블록 (코드는 Github, here)을 실행하는 루비 프로그램이 있습니다. 이 블록들 중에는 시스템 명령이 들어있는 것들이 많이 있습니다. 저는 제가 부르고있는 bash 스크립트에서 AppleScript를 실행하는 아주 특정한 경우를 디버깅하려고합니다. 해당 스크립트는 Spotify를 명령 줄로 제어하기위한 것이며 this is the code입니다.Ruby 스크립트에서 실행되는 AppleScript의 트랩을 중단하십시오.

내가지고있어 문제가 중단 트랩 오류는 스크립트가 실행될 때마다 발생하는 것입니다 :

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

이것은, 호출이 이루어 루비 스크립트의 환경 관련되어야하지만, 왜 그런지보고 싶지 않아. 이 블록은 특정 이벤트가 소켓 연결을 통해 트리거되는 yield 문을 통해 주기적으로 실행됩니다

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

: 여기를 호출하는 코드 블록입니다. 또한이 스크립트는 루비 보석 "데몬"을 사용하여 대몬 화되어 백그라운드에서 실행되도록합니다 (단, ps 및 루비 환경 변수에 따라 현재 사용자로 유지). 뿐만 아니라 각 소켓 연결은 새 스레드를 시작하므로 코드는 주 스레드와 별도의 스레드에서 실행됩니다.

제 디버깅에서 데몬이 문제없이 스크립트를 시작한 후 system "spotify pause" 라인을 실행 해 보았습니다. 또한 다음 스크립트에서 잘 실행 :

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

그래서는 새로운 스레드를 시작하거나 문제가 발생 자체 daemonizing하지 않지만 이러한 것들의 조합 아마도 사실 일 것 같다 그 블록이 생성되는 것은 bash 스크립트에서 AppleScript가 중단 트랩을 발생시키고 있음을 의미합니다.

많은 복잡성을 다시 현실로 끌어 올 수 있다면 이상한 경우를 해결하거나 심지어 디버깅하는 데 도움이되는 제안을 보내 주시면 감사하겠습니다.

+0

사과의 API 인 NSApplescript는 스레드로부터 안전하지 않으므로 주 스레드에서만 실행할 수 있다는 것을 알고 있습니다. 당신은 이것이 백그라운드 스레드에서 실행된다고 말하고 있습니다. 아마도 당신 문제 일 것입니다. – regulus6633

+0

예, 그럴 수 있다고 들리지만 간단한 스레드 예를 들어 보니 이상합니다. –

답변

0

@ regulus6633이 언급했듯이, 이것은 Apple의 NSApplescript가 스레드로부터 안전하지 않기 때문입니다. 이것은 데몬 화와 결합되어 예측할 수없는 행동을 유도합니다.

관련 문제