Plist LaunchAgent не находит путь к 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

Я также хочу, чтобы скрипт работал в фоновом режиме, поэтому я реализовал свой собственный вариант этого Запросить другое решение для 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 сценарий и повторить процесс. Любые идеи?


person P A N    schedule 09.03.2016    source источник
comment
На самом деле вам не нужен сценарий. launchctl.plist имеет ключ KeepAlive   -  person vadian    schedule 09.03.2016
comment
@vadian Спасибо за ваше предложение! Так что мне нужно будет только включить <key>KeepAlive</key><true/> и какой-то идентификатор для приложения Dropbox (не знаю, как)? Не стесняйтесь оставлять ответ, если знаете решение.   -  person P A N    schedule 09.03.2016
comment
Вы должны указать полный путь к исполняемому файлу Dropbox (а не к пакету приложения) в массиве ProgramArguments.   -  person vadian    schedule 09.03.2016
comment
@vadian Спасибо, разобрался. Гораздо лучше, чем использовать скрипт!   -  person P A N    schedule 09.03.2016


Ответы (2)


launchd не выполняет синтаксический анализ строк в стиле оболочки, поэтому escape-последовательности, которые у вас есть в пути к сценарию, будут интерпретироваться как часть фактического имени файла... и он не будет найден. Это должно выглядеть примерно так:

<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>
person Gordon Davisson    schedule 09.03.2016

Файл скрипта, который вы просите запустить launchd, находится в папке вашего пользователя /Library.

Launchd не имеет доступа к этому местоположению. Переместите его в папку, например /usr/local/sbin.

person TheDarkKnight    schedule 09.03.2016
comment
Это неправильно; launchd имеет нормальный доступ к папке библиотеки пользователя. - person Gordon Davisson; 09.03.2016
comment
Я очень надеюсь, что нет, разрешения для этой папки установлены как drwx------@ и нет никакого дополнительного ACL. Если есть специальное исключение для launchd для обхода разрешений POSIX, то это уязвимость безопасности, ожидающая своего появления. - person TheDarkKnight; 09.03.2016
comment
В 10.10 и 10.11 launchd запускается от имени пользователя root и, следовательно, обходит разрешения POSIX. Но на самом деле это не имеет значения здесь, так как он просто запускает osascript от имени вошедшего в систему пользователя и передает его /Users/xxx/Library/... в виде строки; osascript фактически открывает файл, и, поскольку он работает от имени пользователя, он имеет доступ rwx к папке библиотеки пользователя. - person Gordon Davisson; 09.03.2016
comment
Кстати, 10.9 и более ранние версии OS X запускали отдельные экземпляры launchd для демонов запуска (которые запускаются от имени пользователя root) и агентов запуска (которые запускаются от имени вошедшего в систему пользователя). Экземпляры агента/пользователя launchd запускались от имени пользователя, для которого они управляли агентами, поэтому они также имели бы доступ к ~/Library для этого пользователя. - person Gordon Davisson; 09.03.2016
comment
@GordonDavisson поскольку он просто запускает osascript от имени вошедшего в систему пользователя... - Хороший вопрос, и спасибо за обсуждение. Я не заметил, что скрипт является просто параметром вызова osascript, а не вызывается напрямую. - person TheDarkKnight; 10.03.2016