我的 .plist 如下所示...在 /var/log.system.log 中我可以看到
(com.example.exampled[24728]): posix_spawn("/usr/local/bin/ruby /Users/radek/Sites/sinatrasvn/web.rb", ...): No such file or directory
(com.example.exampled[24728]): Exited with exit code: 1
(com.example.exampled): Throttling respawn: Will start in 10 seconds
但如果我运行/usr/local/bin/ruby /Users/radek/Sites/sinatrasvn/web.rb
该脚本,它就可以正常工作。有什么想法吗?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.exampled</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/ruby /Users/radek/Sites/sinatrasvn/web.rb</string>
</array>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
答案1
launchd
不使用 shell 来运行程序;它使用exec
系统调用。这就是上面的 plist 使用数组的原因。
您将该数组的单个元素设置为包含空格的字符串,这会导致launchd
尝试exec("/usr/local/bin/ruby /Users/radek/Sites/sinatrasvn/web.rb")
— 当然,这不是文件的名称。相反,您想要设置数组:
<array>
<string>/usr/local/bin/ruby</string>
<string>/Users/radek/Sites/sinatrasvn/web.rb</string>
</array>
这会将路径作为单独的参数传递给exec()
,然后正确的事情就会发生。
答案2
我有一个 exec 文件,它基本上是一个自托管服务。当我使用代码从终端运行它时,它会毫无问题地触发/Users/user/Public/node_modules/codem-transcode/bin/codem-transcode -c /Users/user/Public/tmp/config.json
因此,我创建了一个要在启动时运行的 plist 脚本,并将其存储在 LaunchAgent 文件夹中。运行它时,我收到“没有此文件或目录”错误。
这张图片展示了我所掌握的几乎所有信息
这是 plist 代码
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key>
<false/>
</dict>
<key>Label</key>
<string>com.wolftech.transcode.job</string>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/tmp/com.wolftech.transcode.job.err</string>
<key>StandardOutPath</key>
<string>/tmp/com.wolftech.transcode.job.out</string>
<key>StartInterval</key>
<integer>60</integer>
<key>ProgramArguments</key>
<array>
<string>/Users/user/Public/node_modules/codem-transcode/bin/codem-transcode -c /Users/user/Public/tmp/config.json</string>
</array>
</dict>
</plist>