对 launchd plist Program 和 ProgramArguments 用法的说明

dec*_*eze 6 launchd

有人可以澄清应该如何使用launchdProgramProgramArguments配置参数吗?我试图在命令行上注册一个服务,我会像这样开始:

$ /foo/bar/baz/python /foo/bar/baz/service start
Run Code Online (Sandbox Code Playgroud)

我已经尝试以各种方式将其分配给 launchd:

$ /foo/bar/baz/python /foo/bar/baz/service start
Run Code Online (Sandbox Code Playgroud)

或者

<key>Program</key>
<string>/foo/bar/baz/python</string>
<key>ProgramArguments</key>
<array>
    <string>/foo/bar/baz/service</string>
    <string>start</string>
</array>
Run Code Online (Sandbox Code Playgroud)

或者

<key>Program</key>
<string>/foo/bar/baz/python</string>
<key>ProgramArguments</key>
<array>
    <string>/foo/bar/baz/service start</string>
</array>
Run Code Online (Sandbox Code Playgroud)

或者

<key>ProgramArguments</key>
<array>
    <string>/foo/bar/baz/python</string>
    <string>/foo/bar/baz/service</string>
    <string>start</string>
</array>
Run Code Online (Sandbox Code Playgroud)

以及几乎任何其他似乎有意义的变体。但是,该服务总是因各种不同的错误而失败。唯一有效的方法是使用确切的行创建一个 .sh 脚本并通过 launchd运行

因此,要一劳永逸地了解launchd服务:launchd如何使用这两个配置参数,我将如何使用它们复制我的bash命令以及两者之间有什么区别?
或者我可能只是偶然发现了运行这个特定服务的问题,无论是否存在通过 bash 执行它时存在的一些环境变量?服务本身没有提供任何有用的输出。

我已经按照 中的建议查阅了execvp(3)手册条目launchd.plist(5),但这并没有真正加深我的理解。

小智 4

如果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>
Run Code Online (Sandbox Code Playgroud)

在这种情况下, in 中的第一个元素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>
Run Code Online (Sandbox Code Playgroud)