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 управляет процессом.

0 ответов

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

KeepAlive <логический или словарь вещей>

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

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

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