6.4. Linux-APP后台应用最广泛的系统

6.4.1. 进程管理利器——superivisor

supervisor是用Python语言编写的基于Linux操作系统的一款进程管理工具,用于监控进程的运行,当发现进程闪退时能自动重启。

比如开发人员想在后台运行一个从消息队列中取出消息再发送到邮件的脚本sendmail.sh,常常会使用&在程序结尾让程序自动运行,并且在退出登录后也继续执行,采用如下的命令。

nohupsh /data/sendmail.sh 2>&1 >> /data/logs/sendmail.log &

当要把运行sh脚本的进程kill掉,则需要通过下面两步:

[root@k8s-master ~]# ps aux |grep *.sh |grep -v grep
root     3263335  0.0  0.0 113184   824 pts/0    S    12:01   0:00 /bin/sh sendmail.sh
[root@k8s-master ~]# kill -9 3263335

上面管理进程的方法有如下的缺点。

·不知道进程的状态,不知道进程在运行的过程中是否终止。
·每次重启进程,kill进程都需要烦琐的步骤。
·如果需要运行大量的守护进程,用这种方法不方便管理。

使用supervisor管理进程有如下的优点。

·能自动启动配置好的进程,并监控每个进程的状态,例如进程是运行着还是停止的。
·监控的进程如果因为各种原因闪退,能自动重启改进程。

安装supervisor很简单

yum install supervisor -y

supervisor安装完成后,在“/usr/bin/”目录下增加了两个命令:

· supervisord : supervisor的服务器端,启动supervisor就是运行这个命令。
· supervisorctl:通过该命令和supervisord进行交换。

启动supervisor,先为其创建配置文件/etc/supervisord.conf,内容如下。

[unix_http_server]
file=/var/run/supervisor/supervisor.sock   ; (the path to the socket file)
;chmod=0700                 ; sockef file mode (default 0700)
;chown=nobody:nogroup       ; socket file uid:gid owner
;username=user              ; (default is no username (open server))
;password=123               ; (default is no password (open server))

;[inet_http_server]         ; inet (TCP) server disabled by default
;port=127.0.0.1:9001        ; (ip_address:port specifier, *:port for all iface)
;username=user              ; (default is no username (open server))
;password=123               ; (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)
;umask=022                  ; (process file creation umask;default 022)
;user=chrism                 ; (default is current user, required if root)
;identifier=supervisor       ; (supervisord identifier, default is 'supervisor')
;directory=/tmp              ; (default is not to cd during start)
;nocleanup=true              ; (don't clean up tempfiles at start;default false)
;childlogdir=/tmp            ; ('AUTO' child log dir, default $TEMP)
;environment=KEY=value       ; (key value pairs to add to environment)
;strip_ansi=false            ; (strip ansi escape codes in logs; def. false)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor/supervisor.sock ; use a unix:// URL  for a unix socket

[include]
files = /etc/supervisord.conf.d/*.conf

在上面的文件中,为了更好地管理进程监控脚本,把进程监控脚本放在/etc/supervisord.conf.d/

例如,为监控运行脚本/data/sendmail.sh,创建文件/etc/supervisord.conf.d/mail.conf,内容如下

[program:mail]                        ; 在supervisor 监控列表中的标识
directory = /data                     ; 启动命令时进入的目录,如果command 中的命令没有使用绝对路径,这项一定要设置
command = /bin/sh /data/sendmail.sh   ; 启动的命令
autostart = true                      ; 随着supervisor 启动而启动。
autoRESTart = true                    ; 自动重启。
startretries = 10                     ; 启动失败时的最多重试次数
startsecs = 5                         ; supervisor 启动5 秒后启动
user = root                           ; 以root 用户的身份运行
redirect_stderr = true                ; 重定向stderr 到stdout
numprocs=1                            ; 启动1个进程
stdout_logfile = /data/logs/mail.log  ; 输出日志的位置

mkdir -p /data/logs/目录

运行supervisord服务端程序

/usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf

使用supervisorctl查看supervisor管理进程的状态。

[root@k8s-master data]# supervisorctl status
mail                             RUNNING   pid 3360232, uptime 0:02:24

测试自动重启

[root@k8s-master data]# ps aux|grep *.sh|grep -v grep|awk '{print $2}'|xargs kill -9
[root@k8s-master data]# ps aux|grep *.sh
root     3370736  0.2  0.0 113184   528 ?        S    12:32   0:00 /bin/sh /data/sendmail.sh
root     3370771  0.0  0.0    440     4 pts/0    S+   12:32   0:00 grep --color=auto sendmail.sh

停止名为“mail”的进程。

[root@k8s-master data]# supervisorctl stop mail
mail: stopped

[root@k8s-master data]# ps aux|grep *.sh
root     3380991  0.0  0.0    436     4 pts/0    R+   12:35   0:00 grep --color=auto sendmail.sh

supervisor还包含了很多实用的命令,可通过帮助查看这些命令

[root@k8s-master data]# supervisorctl help

default commands (type help <topic>):
=====================================
add    clear  fg        open  quit    remove  restart   start   stop  update
avail  exit   maintail  pid   reload  reread  shutdown  status  tail  version