OS X — действительно привилегированный вспомогательный инструмент «по требованию»

Моему приложению необходимо записывать файлы в ограниченные места в файловой системе.
Для этого я использую вспомогательный инструмент, который запускается от имени пользователя root.

Все работает правильно, следуя этому пример, мой вспомогательный инструмент правильно установлен и запущен. Я использую это решение, чтобы иметь возможность «разбудить» вспомогательный инструмент, иначе он не запускается более одного раза после начальной загрузки.

Вспомогательный инструмент ожидает сообщений от основного приложения и правильно их выполняет. У меня также есть своего рода сообщение, которое просит инструмент выключить, который также работает правильно.

Проблема в том, что launchd перезапускаю инструмент каждый раз, когда он завершает работу, независимо от того, какие ключи я указываю в launchd.plist файле.
Я не хочу, чтобы вспомогательный инструмент работал вечно, ожидая сообщений, а запускался только по запросу.

Вопрос: нормально ли, что вспомогательный инструмент перезапускается каждый раз после его завершения? Если нет, то как дать ему умереть и перезапустить по требованию?

Вот содержание launchd.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>KeepAlive</key>
        <dict>
            <key>SuccessfulExit</key>
            <false/>
        </dict>
        <key>RunAtLoad</key>
        <true/>
        <key>Label</key>
        <string>com.mycompany.Helper</string>
        <key>MachServices</key>
            <dict>
                <key>com.mycompany.Helper</key>
                <true/>
            </dict>
     </dict>
</plist>

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


person Vince    schedule 14.10.2015    source источник
comment
Возможно, вы найдете ответ здесь launchd.info   -  person Marek H    schedule 14.10.2015
comment
@MarekH: я читал этот сайт, который по существу перефразирует документацию Apple. К сожалению, никакого секрета я там не обнаружил.   -  person Vince    schedule 15.10.2015
comment
Кажется, я читал там разгрузку. Если это не работает, прочитайте разработчик. apple.com/library/mac/documentation/MacOSX/Conceptual/ У меня нет решения. Некоторые демоны перезагружаются, когда вы их убиваете (например, Mac App Store скачать...)   -  person Marek H    schedule 15.10.2015
comment
Я тоже это читал. Некоторые демоны перезагружаются, когда вы их убиваете, возможно, это правда. Я не убиваю процесс, он просто нормально завершает работу при получении сообщения о прекращении обработки сообщений. Учитывая ключ KeepAlive в plist, его не следует перезапускать. Независимо от того, какое значение я указал для ключа в plist, launchd продолжает перезапускать процесс.   -  person Vince    schedule 15.10.2015


Ответы (1)


Ввод man launchd.plist в терминал дает вам все параметры, которые понимает launchd. Среди них вы можете найти (выделено мной):

KeepAlive ‹ логическое значение или словарь элементов ›

Этот необязательный ключ используется для управления тем, должно ли ваше задание выполняться непрерывно или позволить запросу и условиям управлять вызовом. По умолчанию установлено значение false, поэтому задание будет запущено только по требованию. Значение можно установить равным true, чтобы безоговорочно поддерживать работу задания. В качестве альтернативы можно указать словарь условий, чтобы выборочно контролировать, поддерживает ли launchd задание в активном состоянии или нет. Если предоставлено несколько ключей, запустите их с помощью операции ИЛИ, что обеспечит максимальную гибкость задания для уточнения логики и остановки при необходимости. Если launchd не находит причин для перезапуска задания, он возвращается к вызову по запросу. Задания, которые быстро и часто закрываются, если настроены на поддержание активности, будут регулироваться для экономии системных ресурсов.

Вы не пишете, какими именно были ваши различные комбинации ключей и значений. Но из этой документации, если вы хотите, чтобы демон запускался по запросу, вы должны просто удалить <key>KeepAlive</key> из своего plist или установить его значение в <false/> вместо <dict>...</dict>.

person bfx    schedule 26.02.2019