Clever chaps will have noticed you can just use the ‘&’ like so:
and send your program to the background. But:
- if Node ever prints something and your console is closed, the STDOUT no longer exists and
- what if the process crashes, what if your server reboots?
Ok, so we needed something more robust. More like a real daemon, one that’s recognized by the Operating System as such.
Our servers run Ubuntu’s latest: Karmic Koala, which packs a pretty decent version of upstart. Upstart will eventually replace the well-known
/etc/init.d scripts, and will bring some additional advantages to the table like: speed, health checking, simplicity, etc.
Writing an upstart script
Turns out, writing your own upstart scripts is way easier than building init.d files based on the
Ok so here’s how it looks like; You should store the script in
/etc/init/yourprogram.conf, create one for each Node program you write.
1 2 3 4 5 6 7 8 9 10 11 12
Dont forget to
chmod u+x your file so it will be executable.
Wow how easy was that? Told you, upstart scripts are childsplay. In fact they’re so compact, you may find yourself changing almost every line cause they contain specifics to our environment.
Node can do a lot of stuff. Or break it if you’re not careful. So you may want to run it as a user with limited privileges. We decided to go conventional and chose
We found the easiest way was to prepend the Node executable with a sudo like this:
Don’t forget to change your export HOME accordingly.
Restarting your Node.js daemon
This is so ridiculously easy..
And yes, Node will already:
- automatically start at boottime
- log to
..that’s been defined inside our upstart script.
stop are just shortcuts. Who’s really behind the wheel here, is
initctl. You can play around with the command to see what other possibilities there are:
1 2 3 4 5
Update from October 30th, 2012
The basic idea has not changed since 2009, but we did add some tricks to our upstart script. Here’s what we now use in production at transloadit.com:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
More on Node.js
setTimeout(), you’ll soon get the hang of it 😉
- Node.js video presentation by creator Ryan Dahl
- Node.js slides that accompany the presentation
- About Node on the official website
- Node.js is genuinely exciting by Simon Willison
- node.js by Debuggable
These were imported from my old blog. Please use disqus below for new comments
Remco on 2012-06-22 15:44:16
Thanks for sharing your wisdom! I’ve used your example in combination with ‘forever’ to keep everything running smoothly, as explained on SO:
kinzeron on 2012-06-11 20:12:29
Won’t be a problem to daemonize nodejs like this ? AFAIK a daemon needs two forks. Doing :
nodejs ./path/code.js & amp;
would only fork it once if memory serves well. The daemon might still take terminal control! no ?