Назад | Перейти на главную страницу

Разъяснение по использованию программы launchd plist и ProgramArguments

Может кто-нибудь прояснить, как launchd's Program и ProgramArguments параметры конфигурации следует использовать? Я попытался зарегистрировать сервис, который в командной строке я бы запустил так:

$ /foo/bar/baz/python /foo/bar/baz/service start

Я пробовал разделить это разными способами для launchd:

<key>Program</key>
<string>/foo/bar/baz/python</string>
<key>ProgramArguments</key>
<array>
    <string>/foo/bar/baz/service</string>
    <string>start</string>
</array>

или

<key>Program</key>
<string>/foo/bar/baz/python</string>
<key>ProgramArguments</key>
<array>
    <string>/foo/bar/baz/service start</string>
</array>

или

<key>ProgramArguments</key>
<array>
    <string>/foo/bar/baz/python</string>
    <string>/foo/bar/baz/service</string>
    <string>start</string>
</array>

или

<key>Program</key>
<string>/bin/bash</string>
<key>ProgramArguments</key>
<array>
    <string>-c</string>
    <string>/foo/bar/baz/python /foo/bar/baz/service start</string>
</array>

и почти любой другой вариант, который, казалось бы, имеет смысл. Однако служба всегда выходила из строя с различными ошибками. Единственное, что сработало, - это создать сценарий .sh с точной строкой и запустить который через launchd.

Итак, чтобы раз и навсегда понять службы launchd: как launchd использует эти два параметра конфигурации, как мне воспроизвести с ними мою команду bash и в чем разница между ними?
Или я, возможно, просто наткнулся на проблему запуска этой конкретной службы с некоторыми переменными среды и без них, которые существуют при выполнении ее через bash? Сама служба не предоставила никакой полезной информации.

Я проконсультировался с execvp(3) ручной ввод как рекомендовано в launchd.plist(5), но это не способствовало моему пониманию.

Если Program указано, это всегда будет исполняемая программа, даже если ProgramArguments также было указано.

<key>Program</key>
<string>/foo/bar/baz/python</string>
<key>ProgramArguments</key>
<array>
    <string>/foo/bar/baz/python</string>
    <string>/foo/bar/baz/service</string>
    <string>start</string>
</array>

В этом случае первый элемент в ProgramArguments фактически не оценивается, но передается как argv[0] к выполняемой программе. Обычно в этом нет необходимости, но есть свои применения. Например, программа может проверять argv[0] и работать в другом режиме в зависимости от этого значения.

Для всего остального достаточно использовать ProgramArguments. Это определение должности работает точно так же, как приведенное выше:

<key>ProgramArguments</key>
<array>
    <string>/foo/bar/baz/python</string>
    <string>/foo/bar/baz/service</string>
    <string>start</string>
</array>