无法在 Mac 上使用 launchd 运行 Node.js 脚本

无法在 Mac 上使用 launchd 运行 Node.js 脚本

我正在尝试运行节点在我的 Mac(OSX 10.8.2 Mountain Lion)上每小时运行一次脚本。根据高排名搜索结果,执行此操作的最佳方法是添加launchd启动代理。

由于某种原因,它似乎不起作用。

我编写了以下启动代理文件并将其保存为~/Library/LaunchAgents/agenttest.plist

<?xml version="1.0" encoding="UTF-8"?>
<!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>protocol</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/local/bin/node</string>
            <string>/Users/snorpey/PATH/TO/file.js</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StartInterval</key>
        <integer>3600</integer>
    </dict>
</plist>

launchctl load ~/Library/LaunchAgents/agenttest.plist我通过在终端中运行来启动启动代理。

我还使用 使脚本文件可执行,sudo chmod -x /Users/snorpey/PATH/TO/file.js并使用 更新了文件权限sudo chmod 777 /Users/snorpey/PATH/TO/file.js

当我/usr/local/bin/node /Users/snorpey/PATH/TO/file.js在终端中运行时,脚本运行正常。

但是,它在运行时似乎不起作用launchd。我在中收到以下消息/var/log/system.log

Jan 15 22:32:46 snorpey com.apple.launchd.peruser.501[595] (agenttest[21625]): Exited with code: 1
Jan 15 22:32:46 snorpey com.apple.launchd.peruser.501[595] (agenttest): Throttling respawn: Will start in 10 seconds

为什么执行脚本失败?

答案1

我遇到了这个问题一段时间(出现 127 个错误)。事实证明,你需要在 plist 中添加类似以下内容:

<key>EnvironmentVariables</key>
<dict>
  <key>PATH</key>
  <string>/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin</string>
</dict>

launchd 似乎使用不包含 /usr/local/bin 的最小路径来执行操作,而 node 似乎需要该路径在你的 PATH 上才能正常运行。

答案2

事实证明,无论出于什么原因,我都必须以 root 身份运行这项作业。

我已将文件移至/Library/LaunchAgents/agenttest.plist

我还用 更新了文件所有权sudo chown root /Library/LaunchAgents/agenttest.plist

并且文件权限为sudo chmod 644 /Library/LaunchAgents/agenttest.plist

以 root 身份运行该作业:sudo launchctl load /Library/LaunchAgents/agenttest.plist

答案3

另一种设置我们自己的 PATH 的方法是执行以下命令bash -c "PATH=xxx && run_script"

<?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>ProgramArguments</key>
        <array>
            <string>bash</string>
            <string>-c</string>
            <string>PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin && node /Users/snorpey/PATH/TO/file.js</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>

相关内容