OSX launchd plist for node forever process

帅比萌擦擦* 提交于 2019-12-03 07:38:22

问题


I am trying to write a launchd.plist file for my node server. I am using forever to run my node server. I would like the server to start on boot. I would also like to wait for the mongodb launchd plist to run first.

I installed mongobb using homebrew and it came with a launchd.plist already. I have executed the following:

$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist

plist for mongodb is:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>homebrew.mxcl.mongodb</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/opt/mongodb/mongod</string>
    <string>run</string>
    <string>--config</string>
    <string>/usr/local/etc/mongod.conf</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <false/>
  <key>WorkingDirectory</key>
  <string>/usr/local</string>
  <key>StandardErrorPath</key>
  <string>/usr/local/var/log/mongodb/output.log</string>
  <key>StandardOutPath</key>
  <string>/usr/local/var/log/mongodb/output.log</string>
  <key>HardResourceLimits</key>
  <dict>
    <key>NumberOfFiles</key>
    <integer>1024</integer>
  </dict>
  <key>SoftResourceLimits</key>
  <dict>
    <key>NumberOfFiles</key>
    <integer>1024</integer>
  </dict>
</dict>
</plist>

If I shutdown the computer and restart mongodb fires up as it should.

However my node server is not starting. Any ideas?

<?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>com.test.app</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/local/bin/forever</string>
            <string>-a</string>
            <string>-l</string>
            <string>/var/log/app/app.log</string>
            <string>-e</string>
            <string>/var/log/app/app_error.log</string>
            <string>/data/server/app.js</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StartInterval</key>
        <integer>3600</integer>
    </dict>
</plist>

EDIT:

writing to log file and I see this:

env: node: No such file or directory

I think this means that the node binary cannot be found. I can echo $PATH and /usr/local/bin is in my path. I can start node from the terminal. Ideas?


回答1:


Add environment Variables worked for me.

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

You may also need to add WorkingDirectory to your node app.

<key>WorkingDirectory</key>
<string>path/to/your/node/app</string>



回答2:


I had this problem too, but I solved it using an Automator app that runs at startup.

  1. Open Automator and choose, New Application

  2. Insert in your workflow "Run Shell Script"

  3. Use this code in the shell script, changing the paths to your paths

export PATH=/usr/local/bin/:$PATH
cd /path/to/your/nodejs/app
forever start app.js
  1. Go to System Preferences >> User & Groups and click on Login Items tab

  2. Add your Automator app and be happy.

The important part of the solution is the first line of the script (adding your bin to the path). It would probably work to add a Startup Item pointed at a bash script too (and no Automator script), feel free to try!




回答3:


Add node before forever:

<key>ProgramArguments</key>
<array>
    <string>/usr/local/bin/node</string>
    <string>/usr/local/bin/forever</string>
    <string>/path/to/app.js</string>
</array>



回答4:


This is not an answer of the original questions, but I was looking for a simple way to start a node server (and keep it running) after reboot. I found pm2 to be a much easier to set up than the solutions for forever above.

# install pm2
npm install pm2 -g

# start server
pm2 start app.js

# start pm2 after reboot (might need sudo)
$ pm2 startup

http://pm2.keymetrics.io/docs/usage/startup/




回答5:


I'm not sure when node-launchd came out. However, it seems to be the more reliable solution.

The solution in which a workflow is created and added into the login item is also well appreciated. However, the problem is that if the app is served on a server and when the server is restarted, I wonder the app will be started before the user login to the system. Didn't try, though.



来源:https://stackoverflow.com/questions/18604119/osx-launchd-plist-for-node-forever-process

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!