This howto will show how to restart automatically a nodejs app on crash or on file changes using supervisor and nodemon.
Autorestart on changes
To install nodemon to autorestart app when you change app files:
npm install -g nodemon
To test it’s working, use nodemon like node, passing all parameters you would pass to node:
nodemon app.js --myoptionalparameter MYVALUE;
Autorestart on errors
To install supervisor on a Debian-based system to restart app on crashes:
sudo apt-get install supervisor
Then create a supervisor-app-run.sh wrapper script on a custom location to monitor:
#!/bin/bash cd /path/to/my/app; exec node app.js --myoptionalparameter MYVALUE;
- exec is very important since it gave to supervisor the control of the process
- if you specify nodemon instead of node , the app will not autorestart on crashes but only on changes. On production, only node should be used while on development nodemon is fine to track errors.
Now set up the config file for supervisor creating a new file on /etc/supervisor/conf.d/myapp.conf
with:
[program:myapp] directory=/path/to/my/app command=bash /path/to/my/supervisor-app-run.sh priority=10 ; the relative start priority (default 999) autostart=true ; start at supervisord start (default: true) autorestart=true ; retstart at unexpected quit (default: true) ; startsecs=-1 ; number of secs prog must stay running (def. 10) ; startretries=3 ; max # of serial start failures (default 3) exitcodes=0,2 ; 'expected' exit codes for process (default 0,2) stopsignal=QUIT ; signal used to kill process (default TERM) ; stopwaitsecs=10 ; max num secs to wait before SIGKILL (default 10) user=USER_TO_RUN_APP_HERE ; setuid to this UNIX account to run the program log_stdout=true ; if true, log program stdout (default true) log_stderr=true ; if true, log program stderr (def false) logfile_maxbytes=10MB ; max # logfile bytes b4 rotation (default 50MB) logfile_backups=10 ; # of logfile backups (default 10)
- change USER_TO_RUN_APP_HERE to a system user who can access to app files and directory
Now you have to reread to apply changes without restarting all other services:
sudo supervisorctl reread
So in case of errors you got something like:
ERROR: CANT_REREAD: Invalid user name fakeuserhere in section ‘program:myapp’ (file: ‘/etc/supervisor/conf.d/myapp.conf’)
On success:
myapp: available
If you’ve changed the app configuration, you have to:
sudo supervisorctl update
To apply, then restart the specific app.
sudo supervisorctl restart myapp
Keep an eye on supervisor processes with:
sudo supervisorctl status
Results:
myapp RUNNING pid ****, uptime 0:00:59 anotherapp RUNNING pid ****, uptime 0:29:33
Control the processes
Since exec was specified in the wrapper script before, supervisor can stop the node app on demand with:
sudo supervisorctl stop myapp
Then supervisorctl status
will display something like this:
myapp STOPPED Apr 27 22:53 AM anotherapp RUNNING pid ****, uptime 0:28:16
To run again:
sudo supervisorctl start myapp
- When you will restart the service with
systemctl restart supervisor
, all /supervisor/conf.d/ files will be read again, then if they are set to autostart they will even if you’ve stopped them. - If your node.js app has more than one file to run (e.g. a couple of servers) you can copy and append the [program:myapp] configuration on the same file changing this second block to something like [program:myapptwo] specifying a new wrapper script
One response to “Autorestart nodejs app with supervisor on error and changes”
In some situations, you may want to wait until a number of files have changed. The timeout before checking for new file changes is 1 second. If you’re uploading a number of files and it’s taking some number of seconds, this could cause your app to restart multiple times unnecessarily.