it-swarm-ja.com

Macで起動した状態でNode.jsスクリプトを実行できません

Mac(OSX 10.8.2 Mountain Lion)で1時間ごとに node スクリプトを実行しようとしています。上位の検索結果によると、これを行うための最良の方法は、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

スクリプトの実行に失敗するのはなぜですか?

2
snorpey

私はしばらくこれにぶつかっていました(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を含まない最小パスで処理を実行しているようであり、ノードが正しく機能するには、PATHでこれが必要なようです。

2
Brian Duff

なんらかの理由でこのジョブを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

1
snorpey