Передает ли "launchctl unload" в OSX "ProgramArguments" целевому приложению? - PullRequest
1 голос
/ 28 июля 2011

Я пытаюсь настроить файл .plist для использования с launchctl в OSX.При запуске из командной строки (без использования launchctl) наше приложение выполняется как:

/path/to/ourapp

... и для завершения нашего приложения мы набираем:

/path/to/ourapp -k

... который заставляет новый экземпляр ourapp правильно уничтожить предыдущий запущенный экземпляр.

Теперь я настроил файл .plist для управления выполнением приложения через launchctl, как показано ниже.:

// start.plist
<dict>
    <key>Disabled</key>
        <false/>
    <key>Label</key>
        <string>ourapp</string>
    <key>ProgramArguments</key>
        <array>
            <string>/path/to/ourapp</string>
        </array>
    <key>OnDemand</key>
        <false/>
    <key>UserName</key>
        <string>daniel347x</string>
    <key>SHAuthorizationRight</key>
        <string>system.preferences</string>
</dict>

... и я выполняю его в командной строке следующим образом:

launchctl load /path/to/start.plist

Это успешно работает для запуска приложения.

К сожалению,при создании stop.plist, следующим образом (единственное отличие - добавление аргумента -k):

// stop.plist
<dict>
    <key>Disabled</key>
        <false/>
    <key>Label</key>
        <string>ourapp</string>
    <key>ProgramArguments</key>
        <array>
            <string>/path/to/ourapp</string>
            <string>-k</string>  // <-- only difference is adding this argument
        </array>
    <key>OnDemand</key>
        <false/>
    <key>UserName</key>
        <string>daniel347x</string>
    <key>SHAuthorizationRight</key>
        <string>system.preferences</string>
</dict>

... и выполнение через

launchctl unload /path/to/stop.plist

..... приложение НЕ завершается ... поэтому кажется, что при использовании launchctl приложение не выполняется эквивалентно

/path/to/ourapp -k

Может кто-нибудь сказать мне, что на самом деле делает launchctl unload - т.е.вызывает приложение из командной строки с заданными аргументами или нет -и что я могу сделать, чтобы заставить stop.plist работать при использовании launchctl unload, независимо от того, что он делает?

1 Ответ

4 голосов
/ 31 июля 2011

Высокий уровень

Нет, "launchctl unload" в OSX не передает "ProgramArguments" целевому приложению.Он удаляет plist из тех, которые запускает launchd.

Короткий ответ

Я не уверен, что вы используете launchctl и запустили так, как это было задумано, но попробуйте:

launchctl load /path/to/stop.plist

Более длинный ответ

Команда launchctl используется для управления тем, какие списки запускается launchd в любой момент времени.Когда вы выдаете:

launchctl load /path/to/start.plist

, список загружается в launchd, и ваш "ourapp" срабатывает.Критическим моментом является то, что если "ourapp" не выгружает start.plist, он все равно будет работать в launchd.Вы можете проверить это, просмотрев выходные данные:

launchctl list

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

launchctl load /path/to/stop.plist

Хитрость заключается в том, что, как только вы это сделаете, будут запущены и ваши start.plist и stop.plist.Очевидно, я не проверял ваше приложение / настройку, но это может вызвать странное поведение.Кроме того, я не уверен, что снова запустит «load» в вашем start.plist, так как он уже будет запущен.

Из того, что вы здесь описали, похоже, что launchd и launchctl могут быть не лучшим подходом.Если вы хотите придерживаться этого, я думаю, вам нужно будет добавить системные вызовы в ваш «ourapp», чтобы при получении команды kill он также выгружал как старт, так и стоп лист.Или напишите прокси-скрипт, который выгружает списки и затем вызывает ваш «ourapp -k».Таким образом, в следующий раз, когда вы используете "launchctl load /path/to/start.plist", вы не будете пытаться запустить то, что уже запущено.


Еще одна заметка.Возможно, вы просто использовали «ourapp» в качестве заполнителей, но стоит отметить, что вы, вероятно, хотите использовать уникальные имена Label.Если ничего другого, это поможет вам отслеживать их с помощью "launchctl list".Я не знаю, будет ли у launchd проблема с дублирующимися именами, но кажется, что безопаснее всего избежать этой возможности.

...