Is there any way to have both of this packages running together?
So basically I want to have best from both worlds. Running server automatically (and restarting when
I have not found a way of getting both packages running together. I tried to do @toxa's technique, but when my node.js app threw an exception nodemon would not automatically restart it, instead outputting an error message to the forever log:
nodemon] app crashed - waiting for file changes before starting...
However, forever has a -w
option and the following command is effectively the same as if I'm running nodemon and forever together:
forever start -w my-app.js
The downside of forever -w
versus nodemon
: forever
does not have a --delay option, so my server gets restarted once for each file that is changed.
when using in the package.json use single quotes to make nodemon --existcrash as a single argument.
"start": "forever -c 'nodemon --exitcrash' server.js"
Output:
app_1 | [nodemon] app crashed
app_1 | error: Forever detected script exited with code: 1
app_1 | error: Script restart attempt #1
app_1 | [nodemon] 1.19.4
app_1 | [nodemon] to restart at any time, enter
rs
app_1 | [nodemon] watching dir(s): *.*
app_1 | [nodemon] watching extensions: js,mjs,json
app_1 | [nodemon] starting
node /app/server.js`
app_1 | app is running on port 3000
`
There is an entry about it in the nodemon FAQ:
If you're using nodemon with forever (perhaps in a production environment), you can combine the two together. This way if the script crashes, forever restarts the script, and if there are file changes, nodemon restarts your script. For more detail, see issue 30.
To achieve this you need to add the following on the call to
forever
:
- Use forever's
-c nodemon
option to tell forever to runnodemon
instead ofnode
.- Include the nodemon
--exitcrash
flag to ensure nodemon exits if the script crashes (or exits unexpectedly).- Tell forever to use
SIGTERM
instead ofSIGKILL
when requesting nodemon to stop. This ensures that nodemon can stop the watched node process cleanly.- Optionally add the
--uid
parameter, adding a unique name for your process. In the example, the uid is set tofoo
.
bash forever start --uid foo --killSignal=SIGTERM -c nodemon --exitcrash server.js
To test this, you can kill the server.js process and forever will restart it. If you
touch server.js
nodemon will restart it.To stop the process monitored by forever and nodemon, simply call the following, using the
uid
we assigned above (foo
):
bash forever stop foo
This will stop both nodemon and the node process it was monitoring.
Note that I would not recommend using nodemon in a production environment - but that's because I wouldn't want it restart without my explicit instruction.
I'm using forever-service . . .
This is what worked for me. It does the following: everytime a json or raml file in the applications dist/assets folder is modified, wait 10 seconds and then restart the node app (server.js script):
$ forever-service install raml --script server.js -f " -c nodemon" -o " --delay 10 --watch dist/assets -e json,raml --exitcrash" -e "PATH=/usr/local/bin:$PATH"
Then I can run:
$ service raml start|stop|restart|status
I can also have the service start on server reboot with the chkconfig utility:
$ chkconfig --add raml
$ chkconfig raml on
Toxa was on the right track, the issue that cfogelberg raised is valid, but to avoid that issue you can do the following:
forever -c "nodemon --exitcrash" app.js
this makes sure nodemon
actually exits (rather than giving you the "app crashed" message) and then forever
picks it up again.
In forever --help
this -c
specifies a command to run otherwise it defaults node. Without -c results in the error that is mention in the comments to this answer.
You should run something like this
forever start -c nodemon app.coffee