Best way to handle background processes in linux

Reading Time: < 1 minute

Every programmer soon comes to a point where he requires to setup several jobs to run in the background with 100% uptime. For example a website server, email server, job schedulers etc.

These processes are more like a daemon process. And as like any other job, these tend to stop due to mishandling or uncatchable exceptions/errors. Rather to put a person to sit and constantly monitor the jobs, we make use of the Supervisor.

A Supervisor is a process control system that will start, stop and monitor all our processes and will restart any, that fails.

To install Supervisor on Ubuntu:

sudo apt-get install supervisor

Configuring Supervisor

Let say we have a command that should run indefinitely:

python run_this_command

Supervisor configuration files are stored in the /etc/supervisor/conf.d directory. Let’s create a new configuration file as monitor-my-process.conf.

Inside monitor-my-process.conf write:

[program:my-worker]
process_name=%(program_name)s_%(process_num)02d
command=python run_this_command
autostart=true
autorestart=true
user=linux_user
numprocs=8
redirect_stderr=true
stdout_logfile=/home/linux_user/app.com/worker.log

In this example, the numprocs directive will instruct Supervisor to run 8 processes of my command and monitor all of them, automatically restarting them if they fail. Also change the ‘linux_user’ to the user you want the process to be run as.

Starting Supervisor

Once the configuration file has been created, you may update the Supervisor configuration and start the processes using the following commands:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start my-worker:*

Cheers! Your processes will run indefinitely with auto restart.

Bonus!

Few more commands that are likely to be used sometime later:

Stop all supervisor workers:

sudo supervisorctl stop my-worker:*

Restart all supervisor workers:

sudo supervisorctl restart my-worker:*

Get the current status of workers:

sudo supervisorctl status my-worker:*