关于 launchd plist Program 和 ProgramArguments 用法的说明

关于 launchd plist Program 和 ProgramArguments 用法的说明

有人能解释一下如何使用launchdProgram和配置参数吗?我尝试注册一个服务,在命令行上我会像这样启动它: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),但它并没有真正加深我的理解。

答案1

如果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>

相关内容