【Linux】Linux开机时顺序启动项目并保证项目不挂机(systemctl+supervisor)

目录

一、使用场景

二、具体配置

1.安装supervisor

2.配置supervisor [program]

3.配置systemctl

三、命令简述


一、使用场景

具体场景(可以拆分):

  • 开机立即启动项目
  • 项目之间存在强依赖关系,需要按顺序启动
  • 项目进程不挂机

案例描述:

  • 先启动JAVA项目sidecar,判断它为健康后,再启动项目gateway(开机按顺序启动)
  • 当某个项目中途挂了,将会被supervisor自动唤起(保证项目不挂机)

启动流程:

机器开启 → systemctl启动supervisord → supervisord自动启动sidecar → systemctl调用脚本 → supervisord启动gateway

可以使用在云弹性伸缩自动生成机器时,按要求启动项目等等场景。

二、具体配置

1.安装supervisor

supervisor:用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。

安装(Centos下):
yum install python-setuptools
easy_install supervisor

测试是否安装成功:
echo_supervisord_conf

创建配置文件(如果没权限,可以先创建文件,再move到etc下):
echo_supervisord_conf > /etc/supervisord.conf

2.配置supervisor [program]

概述:配置文件supervisord.conf,目的是配置supervisor托管子进程的方式

(1)执行命令编辑文件

vim /etc/supervisord.conf

(2)在配置文件后增加两个 [program]

[program:sidecar] #子进程名称
command = java -jar /data/application/sidecar/sidecar-0.0.1-SNAPSHOT.jar #启动命令
autostart=true #立即启动
autorestart=true #自动重启
startsecs= 1 #重启多久视为启动成功
startretries= 5 #启动失败重试次数
stdout_logfile = /var/log/supervisor/sidecar.log #进程日志打印位置
stderr_logfile = /var/log/supervisor/sidecar.err.log #进程错误日志打印位置
 
[program:gateway]
command = java -jar /data/application/gateway/gateway-0.0.1-SNAPSHOT.jar 
autostart=false #不立即启动
autorestart=true
startsecs= 1
startretries= 5
stdout_logfile = /var/log/supervisor/gateway.log
stderr_logfile = /var/log/supervisor/gateway.err.log

注意:

  • 一般不会将program直接配置在supervisord.conf内,可以通过[include]指定配置的路径
  • 在program下可以使用字段directroy指定文件目录,但有可能导致子进程启动失效,故本案例不使用

3.配置systemctl

概述:配置systemctl,是为了让服务器按顺序启动进程

(1)进入配置目录

cd /usr/lib/systemd/system

(2)创建supervisord.service,使其开机启动

sudo vim supervisord.service
[Unit]
Description=Process Monitoring and Control Daemon
After=rc-local.service nss-user-lookup.target
  
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisord shutdown
ExecReload=/usr/bin/supervisord reload
killMode=process
  
[Install]
WantedBy=multi-user.target

 (3)创建gateway-start.service,使其在supervisor启动后,再执行脚本启动其他子进程

sudo vim gateway-start.service
[Unit]
Description=gateway-start Service
After=multi-user.target supervisord.service
Requires=supervisord.service
 
[Service]
Type=forking
ExecStart=/data/application/gateway-start.sh
StandardOutput=syslog
StandardError=inherit
Restart=on-failure
RestartSec=3s
 
[Install]
WantedBy=multi-user.target

注意:

  • After=multi-user.target supervisord.service  表示在supervisord启动后执行
  • Requires=supervisord.service 表示他们是强依赖关系
  • Restart=on-failure 表示当脚本返回值不为"0"时,进行重试
  • RestartSec 表示重试时间间隔

/data/application/目录下需要创建脚本gateway-start.sh

cd /data/application # 进入目录
sudo touch gateway-start.sh # 创建文件
sudo chmod +x ./gateway-start.sh  #授权可执行
#!/bin/bash
echo 'About to configure gateway'
start_status=`curl http://localhost:7101/status/sync` #获取健康检查状态(自己写好接口)
if [[ $start_status == 'synced' ]] #判断通过健康检查
then
        echo 'Sidecar status is ok,About to configure gateway'
        supervisorctl start gateway #使用supervisor启动另一个项目
        echo 'Start up complete!'
        exit 0 #返回 0 时,systemctl视为启动成功,便不再重试
else
        echo 'Error! sidecar status is '${start_status}'! Stop start gateway'
        exit 2 #返回非 0 ,systemctl 将会重新调用该脚本 (因为子进程的启动需要时间,故需要做重试)
fi

 此时,需要的配置项都已完成。

三、命令执行

(1)配置开机启动命令

概述:配置完成后,需要执行命令使得配置生效

//重新加载配置
sudo systemctl daemon-reload
 
//配置开机启动
sudo systemctl enable supervisord
sudo systemctl enable zuul-start

(2)扩展

概述:一些常用的命令,用来使用工具

systemctl:

//配置开机启动
sudo systemctl enable supervisord
 
//直接启动项目(不重启服务器)
sudo systemctl start supervisord

//重启项目
sudo systemctl restart supervisord

//查看服务状态
systemctl status supervisord.service

supervisor:

//直接启动
sudo supervisord

//进入控制界面
sudo supervisorctl

//启动项目
sudo supervisorctl start sidecar

//停止项目
sudo supervisorctl stop sidecar

//停止所有项目
sudo supervisorctl stop all

//查看日志
cat /tmp/supervisord.log

 另外,还能通过配置supervisord.conf文件直接进入其控制台

[inet_http_server]
port=192.168.196.216:9001
username=user
password=xbl

 

你可能感兴趣的:(Linux,Supervisord,linux,centos,运维,服务器)