3

Я не новичок для запуска на OS X. В прошлом я создал несколько демонов, последний с Mavericks.

Тем не менее, я, кажется, изо всех сил пытаюсь получить самые простые списки, работающие на Маверикс и Эль-Капитан. Сначала я скопировал свой plist, который запускает Tomcat, и изменил его, чтобы при запуске запустить WebSphere Liberty Profile. Увидев некоторые ошибки, я решил попробовать следующий пример plist с собственного [site] [1] Apple. Следующее даже не работает:

<?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>com.example.hello</string>

    <key>ProgramArguments</key>
    <array>
        <string>hello</string>
        <string>world</string>
    </array>

    <key>KeepAlive</key>
    <true/>

</dict>

Всякий раз, когда я помещаю файл plist в /Library /LaunchDaemons и затем загружаю plist, я вижу следующие ошибки в консоли:

10/5/15 11: 52: 44.868 AM com.apple.xpc.launchd [1]: (com.example.hello) Этот сервис определен как постоянно работающий и по своей сути неэффективный.

05.10.15 11: 52: 44.869 AM com.apple.xpc.launchd [1]: (com.example.hello [66956]) Служба не смогла инициализировать: 15A284: xpcproxy + 12644 [1472] [19011403-4854- 3CCD-9FCF-49C36302EB40]: 0x2

05.10.15 11: 52: 44.870 AM com.apple.xpc.launchd [1]: (com.example.hello) Служба работала только в течение 0 секунд. Нажимаем респаун на 10 секунд.

И это все, что касается выхода. Я попытался записать в журнал StandardOutput и StandardError, но файлы журнала пустые.

Поскольку я наблюдаю, как эта ситуация возникает на Йосемити и в Эль-Капитане, я подумал, что это должно быть что-то с разрешениями:

-rw-r - r-- 1 корневое колесо 418 5 октября 11:52 helloworld.plist

Тем не менее, я попытался запустить демон с разрешениями, установленными на 644 и 755, но я все еще вижу ту же ошибку консоли.

Я что-то пропускаю?

3 ответа3

1

На мой взгляд , <key>KeepAlive</key> выводит com.apple.xpc.launchd[1]: (com.example.hello) This service is defined to be constantly running and is inherently inefficient. Затем он говорит себе перезапустить процесс через 10 секунд с этого <key> .

Я не уверен на 100%, что com.apple.xpc.launchd[1]: (com.example.hello[66956]) Service could not initialize: 15A284: xpcproxy + 12644 [1472][19011403-4854-3CCD-9FCF-49C36302EB40]: 0x2 говорит, потому что у меня нет журнала события, но похоже, что он опротестовывает событие от того оригинального <key> потому что он ничего не выполняет с ним. Может быть, попробуйте удалить <key> или заменить его на что-то другое? возможно:

<key>Label</key>
<string>com.example.hello</string>

<key>ProgramArguments</key>
<array>
    <string>hello</string>
    <string>world</string>
</array>

<key>KeepAlive</key>
<false/>

или же

<key>Label</key>
<string>com.example.hello</string>

<key>ProgramArguments</key>
<array>
    <string>hello</string>
    <string>world</string>
</array>

Опять же, я не уверен на 100% в этом, но я предлагаю попробовать что-то подобное. ОС протестует, что узел keepAlive не нужен, так что удачи.

1

Мне удалось создать рабочий пример на основе помощи @Dooley_labs и @Spiff (спасибо).

В следующем примере эхо Hello World будет передаваться в указанный файл журнала каждые 10 секунд. Консоль не показывает никакого вывода, но когда я просматриваю содержимое файла журнала, я вижу, что Hello World неоднократно записывается в него.

<?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>com.example.hello</string>

        <key>ProgramArguments</key>
        <array>
            <string>echo</string>
            <string>Hello World</string>
        </array>

        <key>KeepAlive</key>
        <true/>

        <key>StandardOutPath</key>
        <string>/var/log/helloworld.log</string>

    </dict>

</plist>
0

Ты будешь бить себя, когда прочтёшь это, но ты не сказал launchctl, какой исполняемый файл запустить!

Первый ответ правильно имеет "эхо" в качестве первого "ProgramArguments", но не зашел так далеко, чтобы сказать, что это была проблема.

Я полагаю, что вы могли бы также сделать это с помощью клавиши "Program", но я не уверен, что вам не пришлось бы повторять это в ключе "ProgramArguments", который, как я считаю, является массивом arg [], передаваемым в исполняемый файл.

Другая вещь, о которой следует быть осторожным, это всегда указывать полный путь к исполняемым файлам. launchd/launchctl довольно труден, но все же, Bad Guy ™ мог предположительно поместить вредоносный исполняемый файл "echo" в $ PATH по умолчанию где-нибудь, а затем подождать, пока launchctl пересмотрит список LaunchDaemon.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .