一、supervisor简介
​ Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。

二,安装方法

前面我们提到了Supervisor是Python的一个工具集,因此,安装方式有两种,一种是利用Python的包管理器pip安装,还一种就是yum安装啦。

(1)

pip包管理器安装

pip install supervisor

(2)

yum安装

yum安装需要配置epel源,epel源的配置通常是使用一个rpm包快速安装即可,例如:epel-release-7-13.noarch.rpm这样的rpm包,直接安装就有epel源了。

yum install supervisor -y

推荐使用yum的安装方式安装,有以下好处:1,有自启脚本 2,有配置文件示例, 总体来说,使用更方便。

三,

Supervisor的web界面开启

vim  /etc/supervisor.conf  ,编辑该文件,其中有一段是被注释的,注释放开,按需修改即可(这个配置文件的注释符号是   ; 类似PHP):

[inet_http_server]         ; inet (TCP) server disabled by default
port=*:9111        ; (ip_address:port specifier, *:port for all iface)
username=zsk              ; (default is no username (open server))
password=123456               ; (default is no password (open server))

这里用户名和密码可自己定义,端口也最好不适用默认端口,修改成一个不常用的端口,然后重启Supervisor服务即可。

systemctl restart supervisord

此时,打开浏览器,输入服务器IP地址:端口,然后在输入账号密码即可进入Supervisor的web管理界面。

很显然,现在的Supervisor才刚安装完毕,并没有任何项目可管理,那么,安装一个tomcat,然后使用Supervisor来进程守护吧。

四,

二进制tomcat的安装

本例中使用的是apache-tomcat-7.0.62.tar.gz,将该文件上传服务器,解压后移动到/usr/local/tomcat即可,在此之前需要配置Java环境,Java快速安装脚本如下:

[root@master ~]# vim auto.sh
#!/bin/bash
tar -zxf `find / -name jdk-8u231-linux-x64.tar.gz`
mv jdk1.8.0_231 /usr/local/jdk
echo "JAVA_HOME=/usr/local/jdk
PATH=.\$PATH:\$JAVA_HOME/bin
CLASSPATH=\$JAVA_HOME/jre/lib/ext:\$JAVA_HOME/lib/tools.jar
export CLASSPATH PATH JAVA_HOME">>/etc/profile
source /etc/profile

编辑/usr/local/tomcat/bin/catalina.sh文件,添加环境变量:

export JAVA_HOME=/usr/local/jdk
export CATALINA_HOME=/usr/local/tomcat
#export CATALINA_PID=/usr/local/tomcat/catalina.pid
export JRE_HOME=/usr/local/jdk/jre
export PATH=$PATH:$CATALINA_HOME:$JAVA_HOME:$JRE_HOME
export CLASSPATH=/usr/local/jdk/lib:/usr/local/jdk/jre/lib

五,

Supervisor的tomcat子模块配置编写:

[root@master bin]# cat  /etc/supervisord.d/tomcat.ini
[program:tomcat]
command=/usr/local/tomcat/bin/catalina.sh run  ;启动运行的命令(前台运行)
process_name=%(program_name)s ; 程序名称
numprocs=1                    ; 复制的进程数
directory=/usr/local/tomcat                ; 启动之后进入的目录
priority=1                    ; 启动的相对优先级
autostart=true                ; supervisord 启动后,也启动(默认跟随启动)
startsecs=3                  ; 程序持续运行3秒后任即为程序已经运行
startretries=3                ; 启动失败后最大的重启尝试次数,默认3次
autorestart=true              ; 异常终止后,自启
exitcodes=0                   ;异常退出错误码
stopsignal=QUIT               ; 向进程发送kill 信号:默认TERM,
stopwaitsecs=10               ; 结束后最大的等待时间
stopasgroup=true             ; send stop signal to the UNIX process group (default false)
killasgroup=true             ; SIGKILL the UNIX process group (def false)
redirect_stderr=true          ; 重定向错误输出到标准输出
stdout_logfile=/usr/local/tomcat/logs/catalina.out        ; 日志输出路径
stdout_logfile_maxbytes=10MB   ; 日志文件大小
stdout_logfile_backups=20     ; 备份日志份数

这里有一个特别需要注意的地方,command 这里run 后面必须要有空格,否则会报错:

[root@master ~]# supervisorctl restart tomcat
tomcat: ERROR (not running)
tomcat: ERROR (spawn error)

具体日志文件报错内容如下:

[root@master bin]# tail -f /var/log/supervisor/supervisord.log
2022-07-26 15:09:16,746 INFO gave up: tomcat entered FATAL state, too many start retries too quickly
2022-07-26 15:09:16,763 INFO spawned: 'tomcat' with pid 13075
2022-07-26 15:09:16,795 INFO exited: tomcat (exit status 1; not expected)
2022-07-26 15:09:17,800 INFO spawned: 'tomcat' with pid 13079
2022-07-26 15:09:17,834 INFO exited: tomcat (exit status 1; not expected)
2022-07-26 15:09:19,845 INFO spawned: 'tomcat' with pid 13083
2022-07-26 15:09:19,879 INFO exited: tomcat (exit status 1; not expected)
2022-07-26 15:09:22,889 INFO spawned: 'tomcat' with pid 13099
2022-07-26 15:09:22,922 INFO exited: tomcat (exit status 1; not expected)
2022-07-26 15:09:23,924 INFO gave up: tomcat entered FATAL state, too many start retries too quick[root@master bin]# tail -f  /usr/local/tomcat/logs/catalina.out run -security     Start in the current window with security managerstart             Start Catalina in a separate windowstart -security   Start in a separate window with security managerstop              Stop Catalina, waiting up to 5 seconds for the process to endstop n            Stop Catalina, waiting up to n seconds for the process to endstop -force       Stop Catalina, wait up to 5 seconds and then use kill -KILL if still runningstop n -force     Stop Catalina, wait up to n seconds and then use kill -KILL if still runningconfigtest        Run a basic syntax check on server.xml - check exit code for resultversion           What version of tomcat are you running?
Note: Waiting for the process to end and use of the -force option require that $CATALINA_PID is defined

究其原因,是因为supervisord配置里没有空格,识别不出来启动命令的参数run。

六,

Supervisor的配置文件每次修改过后,都需要重启服务,重启服务有两种方法:

(1)

[root@master bin]# supervisorctl reload
Restarted supervisord

(2)

[root@master bin]# systemctl restart supervisord

七,

关于supervisor的配置文件说明

Supervisor守护进程的配置文件分为两种,

第一种是主配置文件,yun方式安装的位置是/etc/supervisord.conf ,该文件基本不需要修改,只需要关注最后两行:

[include]
files = supervisord.d/*.ini

这里定义的就是子配置文件的存放路径和子配置文件的后缀名,因此,上面的子配置文件是以ini为后缀的。

第二种是子配置文件,通常,如果有很多的服务需要使用supervisor来守护进程,那么,建议是一个服务写一个子配置文件,关于子配置文件的书写问题,主配置文件里有示例,下面我就翻译一下主配置文件里关于子配置文件书写的规则:

;[program:theprogramname]冒号:后面的名字就是web端显示的名字,比如上面的配置文件是tomcat
;command=/bin/cat              ; the program (relative uses PATH, can take args) 要守护的命令,可以带参数,参数后面要有空格
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)这里不需要更改
;numprocs=1                    ; number of processes copies to start (def 1)启动的时候起多少个线程,是在这里定义,通常也不用改
;directory=/tmp                ; directory to cwd to before exec (def no cwd)#command的路径
;umask=022                     ; umask for process (default None)#该进程使用的umask值,通常也不修改的
;priority=999                  ; the relative start priority (default 999)#启动优先级,通常也不需要改动
;autostart=true                ; start at supervisord start (default: true)#是否自动启动,如果有异常情况的时候,true表示有异常就启动。
;autorestart=true              ; retstart at unexpected quit (default: true)#是否自动重启,如果有异常情况的时候,true表示有异常就启动。
;startsecs=10                  ; number of secs prog must stay running (def. 1)#程序持续运行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 b4 SIGKILL (default 10)#挂起状态,10秒,也不需要配置
;user=chrism                   ; setuid to this UNIX account to run the program#运行程序的用户,比如,es就需要指定用户啦,tomcat不需要指定。
;redirect_stderr=true          ; redirect proc stderr to stdout (default false)#是否输出日志
;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO#日志输出位置,这里需要自定义。
;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)#日志文件大小,默认是50M,根据自己需求更改。
;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)#日志备份数量,这里是10份
;stdout_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
;stdout_events_enabled=false   ; emit events on stdout writes (default false)
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)#日志的配置
;stderr_logfile_backups=10     ; # of stderr logfile backups (default 10)#错误日志份数
;stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)#错误日志最大容量,默认是50M
;stderr_events_enabled=false   ; emit events on stderr writes (default false)#是否记录任何错误
;environment=A=1,B=2           ; process environment additions (def no adds)#环境变量定义,比如tomcat就可以定义环境变量。
;serverurl=AUTO                ; override serverurl computation (childutils)#是否开启web端,auto表示自动检测。; The below sample eventlistener section shows all possible
; eventlistener subsection values, create one or more 'real'
; eventlistener: sections to be able to handle event notifications
; sent by supervisor.

八,

通过第四第五两个简单的步骤,我们就做到了tomcat 的自启和启停一条命令就可以搞定了,不需要编写繁琐的 启停脚本啦,类似这样的服务还有redis,es,moogdb等等服务,都可以通过Supervisor守护进程来管理啦,并且,Supervisor还有一个简单的web页面方便我们在任意的同网段内管理服务啦,是不是特别方便?

查看日志也更方便啦:

Linux之奇怪的知识---supervisor超级守护进程的意义和使用方法相关推荐

  1. 操作系统学习笔记02【进程控制——进程互斥的硬件实现方法】【自用】

    1.进程控制 什么是进程控制? 如何实现进程控制: 为了避免把某一进程pbc从一个队列转移到另一个队列,但是并没有把pbc内的状态标志改为新的对应状态,从而导致pcb的状态标志与实际所处队列不一样这一 ...

  2. Linux supervisor守护进程的安装和使用

    个人网站:http://xiaocaoshare.com/ supervisor守护进程的介绍 Supervisor(http://supervisord.org/)是用Python开发的一个clie ...

  3. linux基础知识_压缩—进程管理-网络管理-ftp-nfs-ssh-scp

    linux基础知识_压缩-进程管理-网络管理-ftp-nfs-ssh-scp 1.压缩包管理 gzip .gz格式的压缩包,不打包,分别压缩,原文件消失 bzip2 .bz2格式的压缩包,原文件不会消 ...

  4. linux c++ 守护 程序,supervisor守护进程 | C/C++程序员之家

    一.安装: sudo pip install supervisor sudo easy_install supervisor apt-get install supervisor yum instal ...

  5. supervisor 守护php,laravel队列之Supervisor守护进程(centos篇)

    前言 unbutun和centos均为linux系统,官方为我们提供了Homestead可以很好的模拟在服务器中的开发和运行.之前写了一篇基于Homestead(unbutun)关于Superviso ...

  6. linux 易语言窗口程序_浅谈Linux入门的基本知识

    浅谈Linux入门的基本知识 图形模式与文字模式的切换方式Linux预设提供了六个命令窗口终端机让我们来登录. 默认我们登录的就是第一个窗口,也就是tty1,这个六个窗口分别为tty1.tty2 - ...

  7. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之按键驱动框架

    文章目录 前言 1.APP怎么读取按键值 1.1.查询方式 1.2.休眠-唤醒方式 1.3.poll方式 1.3.异步通知方式 1.5. 驱动程序提供能力,不提供策略 2.按键驱动程序框架--查询方式 ...

  8. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型

    文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...

  9. 【嵌入式Linux】嵌入式Linux应用开发基础知识之多线程编程

    文章目录 前言 1.多线程基础编程--创建线程和使用等待函数休眠线程 1.1.程序分析--使用信号量PV操作sem_wait 1.2.程序分析--使用条件变量pthread_cond_wait 2.一 ...

  10. 【嵌入式Linux】嵌入式Linux应用开发基础知识之网络通信

    文章目录 前言 1.网络通信--TCP 1.1.常用概念辨析 1.2.程序分析 2.网络通信--UDP 程序分析 参考资料 前言 韦东山嵌入式Linux应用开发基础知识学习笔记 文章中大多内容来自韦东 ...

最新文章

  1. 视频数据处理方法!关于开源软件FFmpeg视频抽帧的学习
  2. 《影响力》承诺和一致原理深入剖析,人们对自己的选择是很相信的
  3. 人生的主干,提及程序化
  4. Python实现二叉树的遍历
  5. Spring MVC中返回JSON数据的几种方式
  6. 关于webSQL的总结
  7. session的销毁方式
  8. Python骚操作,生成WiFi二维码,扫描一键联网
  9. 三层交换(VLAN间路由)
  10. vue项目文件命名规范推荐
  11. 共建WEB3.0基础设施 NodeSea推出分布式域名后缀 .fil .bzz .xch .iot
  12. ES6数组得扩展与对象的扩展
  13. Cisco 交换机的操作
  14. 转换接头PL8000V-B 0-70MPa
  15. 尼古拉·特斯拉,到底有多神?
  16. Java 对象的构造和初始化
  17. 数据库原理课后答案 第二章
  18. 金蝶k3单据编码规则_编码规则
  19. socket缓冲区/sk_buffer/滑动窗口关系
  20. 瑞数FSSBBIl1UgzbN7N443T分析

热门文章

  1. xp电脑不能访问服务器共享文件夹,XP系统电脑无法访问WIN7共享文件夹怎么办
  2. Git全解 idea github gitee gitlab
  3. 从汇编层次理解malloc函数
  4. python计算决策树误差_《统计学习方法》第五章决策树 练习题解答
  5. 严蔚敏《数据结构》——线索二叉树
  6. Matlab中的ans小结
  7. 2019年安徽省程序设计大赛题解
  8. java案例:模拟双色球中奖
  9. python用法查询软件下载_布同自制Python函数帮助查询小工具
  10. 2018杭州云栖大会,梁胜博士的演讲PPT来啦! 1