条件
- 最后一个命令行程序需要待前面6个命令行程序启动完成之后才能启动
测试的脚本
[root@ _42_ ~/supervison-test/priority-script]# cat 1.sh
#!/bin/bash
echo "注册服务,第一个启动"
sleep 360000
[root@ _43_ ~/supervison-test/priority-script]# cat 2.sh
#!/bin/bash
echo "普通优先级的脚本"
sleep 310000
[root@ _44_ ~/supervison-test/priority-script]# cat 3.sh
#!/bin/bash
echo "普通优先级的脚本"
sleep 310000
[root@ _45_ ~/supervison-test/priority-script]# cat 4.sh
#!/bin/bash
echo "普通优先级的脚本"
sleep 310000
[root@ _46_ ~/supervison-test/priority-script]# cat 5.sh
#!/bin/bash
echo "普通优先级的脚本"
sleep 310000
[root@ _47_ ~/supervison-test/priority-script]# cat 6.sh
#!/bin/bash
echo "普通优先级的脚本"
sleep 310000
[root@ _48_ ~/supervison-test/priority-script]# cat 7.sh
[root@ _48_ ~/supervison-test/priority-script]# cat 7.sh
#!/bin/bash
process_num=`ps aux | grep -E '(1|2|3|4|5|6).sh' | wc -l`
if [ $process_num -eq 6 ];then
echo "main程序启动成功"
sleep 30000
else
echo "main程序启动失败"
exit 1
fi
这里有1-7.sh七个脚本,最后一个要等到前面6个脚本启动成功才能启动
安装supervison安装配置并编写配置文件
通过pip安装
yum -y install python-pip
pip install supervisor
生成配置文件
当你安装完成 Supervisor 之后,你就可以使用 echo_supervisord_conf 命令来输出一个配置文件:
echo_supervisord_conf > /etc/supervisord.conf
当然你可以将配置文件生成到任意位置,但是你需要在启动时使用 -c 选项来指定配置文件的路径。
注意
默认的配置文件是下面这样的,但是这里有个坑需要注意,supervisord.pid 以及 supervisor.sock 是放在 /tmp 目录下,但是 /tmp 目录是存放临时文件,里面的文件是会被 Linux 系统删除的,一旦这些文件丢失,就无法再通过 supervisorctl 来执行 restart 和 stop 命令了,将只会得到 unix:///tmp/supervisor.sock 不存在的错误 。
建议修改为 /var/run 目录,避免被系统删除
修改配置文件
[root@ _58_ ~/supervison-test]# cat /etc/supervisord.conf
[unix_http_server]
file=/var/run/supervisor.sock ; the path to the socket file
;chmod=0700 ; socket 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=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10 ; # of main logfile backups; 0 means none, 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=supervisord ; setuid to this UNIX account at startup; recommended 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.sock ; use a unix:// URL for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris ; should be same as in [*_http_server] if set
;password=123 ; should be same as in [*_http_server] if set
;prompt=mysupervisor ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history ; use readline history if available
[group:jar-group]
programs=jar1,jar2,jar3,jar4,jar5,jar6,jar7 ; each refers to 'x' in [program:x] definitions
;priority=999 ; the relative start priority (default 999)
[include]
files = /etc/supervisor/*.conf
这里我修改了如下内容
- [unix_http_server] 配置段 file=/var/run/supervisor.sock
- [supervisorctl] 配置段 serverurl=unix:///var/run/supervisor.sock
- ;[group:thegroupname] 为 [group:jar-group]
- ;programs=progname1,progname2 为 programs=jar1,jar2,jar3,jar4,jar5,jar6,jar7
- [include] 配置段的 files = /etc/supervisor/*.conf
启动supervison
接下来添加各个程序的配置文件
[root@ _61_ ~/supervison-test]# mkdir /etc/supervisor/
[root@ _62_ ~/supervison-test]# cd /etc/supervisor/
[root@ _67_ /etc/supervisor]# cat jar1.conf
[program:jar1] ;项目名称
directory = /root/supervison-test/priority-script/ ; 程序的启动目录
command = bash 1.sh ;启动命令,可以看出与手动在命令行启动的命令是一样
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 2 ; 启动失败自动重试次数,默认是 3
user = root ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 50MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /tmp/jar1.log
loglevel=info
priority=666 ; 优先级越高表示程序最后启动并首先关闭
[root@ _68_ /etc/supervisor]# cat jar2.conf
[program:jar2] ;项目名称
directory = /root/supervison-test/priority-script/ ; 程序的启动目录
command = bash 2.sh ;启动命令,可以看出与手动在命令行启动的命令是一样
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 2 ; 启动失败自动重试次数,默认是 3
user = root ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 50MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /tmp/jar2.log
loglevel=info
priority=888 ; 优先级越高表示程序最后启动并首先关闭
[root@ _69_ /etc/supervisor]# cat jar3.conf
[program:jar3] ;项目名称
directory = /root/supervison-test/priority-script/ ; 程序的启动目录
command = bash 3.sh ;启动命令,可以看出与手动在命令行启动的命令是一样
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 2 ; 启动失败自动重试次数,默认是 3
user = root ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 50MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /tmp/jar3.log
loglevel=info
priority=888 ; 优先级越高表示程序最后启动并首先关闭
[root@ _70_ /etc/supervisor]# cat jar7.conf
[program:jar7] ;项目名称
directory = /root/supervison-test/priority-script/ ; 程序的启动目录
command = bash 1.sh ;启动命令,可以看出与手动在命令行启动的命令是一样
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 2 ; 启动失败自动重试次数,默认是 3
user = root ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 50MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /tmp/jar7.log
loglevel=info
priority=999 ; 优先级越高表示程序最后启动并首先关闭
其中jar1.conf中的优先级最低,最先启动 jar2-6.sh的优先级其次 jar7.sh的优先级最高,最后启动
启动supervison
[root@ _59_ /etc/supervisor]# supervisord -c /etc/supervisord.conf
[root@ _60_ /etc/supervisor]# supervisorctl status
jar-group:jar1 RUNNING pid 13619, uptime 0:00:05
jar-group:jar2 RUNNING pid 13621, uptime 0:00:05
jar-group:jar3 RUNNING pid 13620, uptime 0:00:05
jar-group:jar4 RUNNING pid 13623, uptime 0:00:05
jar-group:jar5 RUNNING pid 13622, uptime 0:00:05
jar-group:jar6 RUNNING pid 13631, uptime 0:00:05
jar-group:jar7 RUNNING pid 13624, uptime 0:00:05
已正常启动所有脚本
[root@ _77_ /etc/supervisor]# ps aux | grep '\.sh'
root 13855 0.0 0.1 113120 1404 ? S 12:31 0:00 bash 1.sh
root 13856 0.0 0.1 113120 1220 ? S 12:31 0:00 bash 3.sh
root 13857 0.0 0.1 113120 1404 ? S 12:31 0:00 bash 2.sh
root 13858 0.0 0.1 113120 1216 ? S 12:31 0:00 bash 5.sh
root 13859 0.0 0.1 113120 1404 ? S 12:31 0:00 bash 4.sh
root 13860 0.0 0.1 113120 1404 ? S 12:31 0:00 bash 6.sh
root 13861 0.0 0.1 113120 1408 ? S 12:31 0:00 bash 7.sh
root 13888 0.0 0.0 112664 964 pts/1 S+ 12:31 0:00 grep --color=auto \.sh
...