launchd 给我“没有这样的文件或目录”错误

launchd 给我“没有这样的文件或目录”错误

我的 .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>

相关内容