Best Way to Daemonize Applications on Linux
22nd December 2014 by Ali Erdinç KöroğluI tried to explain how to daemonize applications before but how about monitor and even start/stop/restart processes locally or remotely? Well, here is Supervisor. Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems.
As you know we need to write rc.d or systemd scripts for every single process instance. It’s hard to write and maintain also those scripts are not able to automatically restart a crashed process. So supervisord is the solution, it’s simple, efficient, centralized, extensible etc.. etc..
Supervisor has two component, supervisord and supervisorctl. Supervisord is the server side of supervisor and is responsible for starting child programs, controlling, logging and handling events. It’s also providing a web interface to view and control process status and an XML-RPC interface to control supervisor and the programs it runs. Supervisorctl on the otherhand, providing a shell-like interface for connecting to supervisord. But 1st let us install into our CentOS7 server. Supervisor is available on EPEL7 repository, if you don’t know how to add EPEL repository, please read this.
Installation is easy
[root@Neverland ~]# yum install supervisor |
Please don’t forget to enable supervisor for systemd
[root@Neverland ~]# systemctl enable supervisord |
It begins with a config file :)
[unix_http_server] file=/var/tmp/supervisor.sock; (the path to the socket file) [inet_http_server] ; inet (TCP) server disabled by default port=192.168.1.1:9001 ; (ip_address:port specifier, *:port for all iface) username=superv ; (default is no username (open server)) password=superv ; (default is no password (open server)) [supervisord] logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB) logfile_backups=10 ; (num of main logfile rotation backups;default 10) loglevel=info ; (log level;default info; others: debug,warn,trace) pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) nodaemon=false ; (start in foreground if true;default false) minfds=1024 ; (min. avail startup file descriptors;default 1024) minprocs=200 ; (min. avail process descriptors;default 200) [rpcinterface:supervisor] supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///var/tmp/supervisor.sock ; use a unix:// URL for a unix socket [include] files = supervisord.d/*.ini |
This process config file includes details such as directory, command, process name, process owner, logging etc. If you wanna know more, please read this.
[program:fixtures] directory=/opt/pronet/fixtures command=/usr/java/jdk1.7.0_71/bin/java -Dfile.encoding=UTF-8 -Dproject.properties=/opt/pronet/fixtures/fixtures.properties -Dlog4j.. process_name=%(program_name)s user=pronet autostart=true autorestart=true redirect_stderr=true stdout_logfile=/var/log/pronet/fixtures-stdout.log stdout_logfile_maxbytes=1MB stdout_logfile_backups=10 stdout_capture_maxbytes=1MB stdout_events_enabled=false stderr_logfile=/var/log/pronet/fixtures-stderr.log stderr_logfile_maxbytes=1MB stderr_logfile_backups=10 stderr_capture_maxbytes=1MB stderr_events_enabled=false |
So when you start or restart supervisord fixtures process will start or restart too.. (depends on your process config)
[root@Neverland ~]# systemctl start supervisord [root@Neverland ~]# supervisorctl status fixtures fixtures RUNNING pid 5786, uptime 0:00:03 |
And you can monitor or control remotely..
[root@nagios ~]# supervisorctl -s http://192.168.1.1:9001 -u superv -p superv status fixtures fixtures RUNNING pid 5786, uptime 0:04:20 [root@nagios ~]# supervisorctl -s http://192.168.1.1:9001 -u superv -p superv restart fixtures fixtures: stopped fixtures: started |
There are some centralized supervisord web interfaces but I’ll cover them later :)

This work, unless otherwise expressly stated, is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.

