我有一个启动的脚本,其中我尝试运行的命令出错(显然这不是一个字,现在是),抱怨使用不当。
我得到的特定错误是转储到系统日志中的命令用法文本。据此,我推断plist中的其他信息(命令的路径,时间等)已正确解析,而不是命令的选项。
使用命令后,我有最后一行:
18/11/2013 09:30:00.101 com.apple.launchd.peruser.501: (fake.lable.seti[33833]) Exited with code: 1
但这仅表示“我退出并出错”。
我知道launchd会将命令从其选项中分离出来,并且在手册页中向您介绍了ProgramArguments:“ ...请注意:许多人对此键感到困惑。请非常仔细地阅读execvp(3)!。”
好吧,我读了execvp(3),但我也不是明智的,所以我想问你很多。
通常,从终端运行命令如下所示:
/Library/Application\ Support/BOINC\ Data/boinccmd --host localhost --passwd gobbledygook --project http://setiathome.berkeley.edu/ update
这可以治疗。
这就是我在LaunchAgent plist的Program / ProgramArguments部分中将其拆分的方式:
<key>Program</key>
<string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
<array>
<string>--host localhost</string>
<string>--passwd gobbledygook</string>
<string>--project http://setiathome.berkeley.edu/ update</string>
</array>
(为记录起见,我本来拥有boinccmd的路径\\逃逸了,但这不起作用,为您启动了路径中的转义空格)
我试着进一步分解参数:
<key>Program</key>
<string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
<array>
<string>--host</string>
<string>localhost</string>
<string>--passwd</string>
<string>gobbledygook</string>
<string>--project</string>
<string>http://setiathome.berkeley.edu/</string>
<string>update</string>
</array>
但这似乎也不起作用。
和以往一样,我非常确定自己缺少这么简单的东西。
谢谢。
回答:
ProgramArguments的第一行必须是程序的路径。这就是让我绊倒的东西,的确是“ ...请仔细阅读!..”注释的意思:)我还发现我不得不将参数分解为它们的组成部分。当我将所有这些都放在适当的位置时,整个过程就很有吸引力。非常感谢你。
<key>Program</key>
<string>/Library/Application Support/BOINC Data/boinccmd</string>
<key>ProgramArguments</key>
<array>
<string>/Library/Application Support/BOINC Data/boinccmd</string>
<string>--host</string>
<string>localhost</string>
<string>--passwd</string>
<string>gobbledygook</string>
<string>--project</string>
<string>http://setiathome.berkeley.edu/</string>
<string>update</string>
</array>
关于为什么要这样的一个易于理解的解释的最终编辑,请参阅SirPavlova的解释。
〜W
<string>--host localhost</string>
肯定不会工作。请记住,当您向外壳程序编写命令行时,它不知道选项的组成部分和常规参数是什么- 在将参数传递给正在运行的程序之前,它只是在空格上分割。另外,如果您要显示boinccmd
正在报告的确切错误,则可能会有所帮助。