Может кто-нибудь прояснить, как 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>