有时候程序和程序之间有依赖关系,当一个程序启动成功之后才能启动第二个,这里没有健康检测之类的更加细致的检测手段,只是在启动顺序上做控制

条件

  • 最后一个命令行程序需要待前面6个命令行程序启动完成之后才你能启动

测试的脚本

[root@ _42_ ~/supervisor-test/priority-script]# cat 1.sh 
#!/bin/bash

echo "注册服务,第一个启动"
sleep 360000

[root@ _43_ ~/supervisor-test/priority-script]# cat 2.sh 
#!/bin/bash

echo "普通优先级的脚本"
sleep 310000
[root@ _44_ ~/supervisor-test/priority-script]# cat 3.sh 
#!/bin/bash

echo "普通优先级的脚本"
sleep 310000
[root@ _45_ ~/supervisor-test/priority-script]# cat 4.sh 
#!/bin/bash

echo "普通优先级的脚本"
sleep 310000
[root@ _46_ ~/supervisor-test/priority-script]# cat 5.sh 
#!/bin/bash

echo "普通优先级的脚本"
sleep 310000
[root@ _47_ ~/supervisor-test/priority-script]# cat 6.sh 
#!/bin/bash

echo "普通优先级的脚本"
sleep 310000
[root@ _48_ ~/supervisor-test/priority-script]# cat 7.sh 
[root@ _48_ ~/supervisor-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个脚本启动成功才能启动

安装supervisor安装配置并编写配置文件

通过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_ ~/supervisor-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_ ~/supervisor-test]# mkdir /etc/supervisor/
[root@ _62_ ~/supervisor-test]# cd /etc/supervisor/
[root@ _67_ /etc/supervisor]# cat jar1.conf 
[program:jar1] ;项目名称
directory = /root/supervisor-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/supervisor-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/supervisor-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
最后修改:2019 年 07 月 27 日 02 : 43 PM