How to Run NodeJS App in Background
Here are the different ways to run NodeJS app in background. For our example, we will assume that we have a NodeJS server app.js at /home/ubuntu/app.js. Please update the file path of NodeJS file in all the following commands, as per your requirement.
1. Using Forever
Forever is a simple NodeJS package that allows you to run NodeJS applications as a process. Here is the command to install it.
$ sudo npm install forever
Here is the command to start a NodeJS app using forever. If you do not provide absolute path to your .js file, forever will look for it in your present working directory.
$ sudo forever start /home/ubuntu/app.js
Here is the command to stop NodeJS app.
$ sudo forever stop /home/ubuntu/app.js
By default, forever uses node and you don’t need to specify it. But if you use older versions of NodeJS, you may need to use –harmony option along with node to run the app. In this case, we also need to use -c option with forever to explictly run a NodeJS command within quotes.
$ sudo forever start -c "node --harmony app.js"
2. Using nohup &
You may also use the nohup command along with & to run NodeJS app in background, since they allow you to run any Linux process in background. Here is an example to run app.js in background.
nohup node /home/ubuntu/app.js &
Although this is a common way to run processes in background, it does not give you a good control over the process. For example, you cannot stop or restart the process easily. You will need to find out the PID of this process and then use kill command to stop it, which is not a graceful exit.
3. Using systemd
Most Linux systems have systemd that allows you to define & manage services. In this case, you need to add the following command to the first line of your app.js file. It will set the runtime environment for your application.
Next, make this file an executable with the following command.
$ sudo chmod +x /home/ubuntu/app.js
Create a service file for your app at /etc/systemd/system
$ sudo vi /etc/systemd/system/app.service
Add the following lines to it. Specify the absolute path to your NodeJS file for ExecStart variable. Also update WorkingDirectory to be the directory that contains your app.js file.
[Unit] Description=App [Service] ExecStart=/home/ubuntu/app.js Restart=always User=nobody # Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody' Group=nogroup Environment=PATH=/usr/bin:/usr/local/bin Environment=NODE_ENV=production WorkingDirectory=/home/ubuntu [Install] WantedBy=multi-user.target
You can start your app with the following command.
$ sudo systemctl start app
You can also enable it to start on boot with the following command.
$ sudo systemctl enable app
You can view its logs using the following command
journalctl -u app
In this article, we have covered 3 different ways to run a NodeJS app as a background process. If you are looking for a simple way to run a background NodeJS app, then go for Forever. But if you need a more robust service, then try systemd.