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

Другие вопросы по тегам