If you have a Node.js app running on an OS X server, you probably:
- Want it to start automatically when the system boots
- Want to use something like pm2 or forever to monitor the status of the app, log errors, and make sure it stays up
While pm2 has the ability to generate startup scripts for use with Ubunutu, Centos, and systemd, it does not work with OS X. The best approach is to use launchd, an OS X-specific daemon manager that replaces cron
. It uses XML-based files for configuration. This guide will walk you through the process. Note: "xyz" is used as a placeholder for the application name throughout this guide.
- Create a new LaunchDaemon config file for your app -
sudo vi /Library/LaunchDaemons/org.node.xyz.plist
- Add the contents of
org.node.xyz.plist
, altering it with your configuration, and save (:wq
) and exit sudo chown root:wheel /Library/LaunchDaemons/org.node.xyz.plist
sudo chmod 644 /Library/LaunchDaemons/org.node.xyz.plist
- Find your path by typing
echo $PATH
sudo vi /etc/launchd.conf
- Add the contents of
launchd.conf
, but use whatever$PATH
you just echoed, then save and exit sudo shutdown -r now
- this will reboot the system. If you skip this step, the changes tolaunchd.conf
will not take effect.- Log back into the machine
sudo launchctl load /Library/LaunchDaemons/org.node.xyz.plist
- Verify that it loaded correctly -
sudo launchctl list | grep xyz
. Three columns will be returned -PID
,status
, andlabel
. If there is no value forPID
, but there is a value forstatus
, something went wrong. - If everything went according to plan, you should now be able to
pm2 list
and see your Node app running. If you get an error, you might need tosudo chmod 777 /Users/<<me>>/.pm2/pm2.log
.
Working with this project: https://github.com/Hackworth/VeraHomeKitBridge
I've switched from trying to get this working with forever over to pm2 (1.1.3) and just not getting any process listed for pm2. If I manually start with
pm2 start ~/projects/VeraHomeKitBridge/app.js --name="Vera"
I get the expected process but the app fails to work correctly. My plist is below.If I stop the app.js within pm2 and manually start it with forever
forever start app.js
from within the project directory, the app works fine. Go figure...So ideally I'd want the plist to work for forever, but no matter how I edit it, I can't seem to get it to start in forever...
Ideas?