LaunchAgent plist не находит путь к AppleScript в iCloud
По какой-то причине Dropbox завершает работу (вылетает или прекращает работу) через несколько дней без объяснения причин.
Поэтому я начал исследовать путь для AppleScript
автоматически перезапустить приложение, когда оно завершается.
Это привело меня к этому сценарию:
repeat
delay 120 #Run every two minutes
tell application "System Events"
if name of every process does not contain "Dropbox" then tell application "Dropbox" to launch
end tell
delay 5
end repeat
Я также хочу, чтобы скрипт выполнялся в фоновом режиме, поэтому я реализовал свой вариант этого варианта Ask Different для launchctl
,
В ~/Library/LaunchAgents/
Я создаю файл с именем dropbox-keep-alive.plist
с этим содержанием:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>dropbox-keep-alive.job</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/osascript</string>
<string>/Users/xxx/Library/Mobile\ Documents/com\~apple\~ScriptEditor2/Documents/dropbox-keep-alive.scpt</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Путь к AppleScript указан в <array>
выше и .job
ярлык для launchutil
назначается под <key>
,
Затем я загружаю .plist
:
launchctl load -w ~/Library/LaunchAgents/dropbox-keep-alive.plist
И затем начните это:
launchctl start dropbox-keep-alive.job
Для тестирования я выхожу из Dropbox и жду 2+ минуты, но ничего не происходит.
Если я попробую launchctl load -w
опять получаю сообщение, что оно уже загружено. launchctl start
не дает ответного сообщения.
Я знаю, что AppleScript работает, потому что он работает при запуске с osascript
непосредственно. Но где-то в .plist
- или мое управление launchctl
- есть что-то, что не работает.
Я пытался launchctl unload -w
сценарий и повторить процесс. Есть идеи?
2 ответа
launchd не выполняет парсинг в стиле оболочки для строк, поэтому экранирование, которое вы имеете в пути к сценарию, будет интерпретироваться как часть фактического имени файла... и оно не будет найдено. Это должно выглядеть больше так:
<key>ProgramArguments</key>
<array>
<string>/usr/bin/osascript</string>
<string>/Users/xxx/Library/Mobile Documents/com~apple~ScriptEditor2/Documents/dropbox-keep-alive.scpt</string>
</array>
Я не уверен, что это единственная проблема, но это, безусловно, проблема. Если необходима дальнейшая отладка, попробуйте захватить вывод ошибок из osascript
добавив что-то вроде:
<key>StandardErrorPath</key>
<string>/Users/xxx/Library/Logs/dropbox-keep-alive.err</string>
Файл сценария, который вы запрашиваете launchd для выполнения, находится в папке вашего пользователя /Library.
Launchd не имеет доступа к этому месту. Переместите его в папку, например /usr/local/sbin