Прерывание прерывания из AppleScript, запускаемого из сценария Ruby
У меня есть программа на Ruby, которая, помимо прочего, выполняет пользовательские блоки кода (код здесь на Github). Многие из этих блоков содержат системные команды, и я пытаюсь отладить очень специфический случай выполнения фрагмента AppleScript в скрипте bash, который я вызываю. Рассматриваемый скрипт предназначен для управления 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
оператор, когда конкретное событие инициируется через соединение сокета. Скрипт также демонизируется, используя рубиновый гем "daemons", чтобы он мог работать в фоновом режиме (но все еще как текущий пользователь, согласно ps
и переменная среды ruby). Кроме того, каждое соединение с сокетом запускает новый поток, поэтому код запускается в отдельном потоке от основного.
В своей отладке я попытался запустить строку system "spotify pause"
после того как демон запускает скрипт, без проблем. Он также отлично работает в следующем сценарии:
Thread.new do
system("spotify pause")
end
Таким образом, проблема не в том, чтобы запустить новый поток или демонизировать саму себя, но кажется, что это комбинация этих вещей и, возможно, тот факт, что блок получен, что означает, что AppleScript создает ловушку прерывания в скрипте bash.
Если бы вы смогли снова и снова воплотить в жизнь множество уровней сложности, я был бы признателен за любые ваши предложения по решению или даже отладке этого странного случая!
1 ответ
Как упомянуто @regulus6633, это связано с тем, что NSApplescript от Apple не является поточно-ориентированным. Это в сочетании с демонизацией приводит к непредсказуемому поведению.