【Linux】Linux开机时顺序启动项目并保证项目不挂机(systemctl+supervisor)
一、使用场景具体场景:开机立即启动项目项目之间存在强依赖关系,需要按顺序启动项目进程不能挂三个场景,可以拆分。二、具体配置
·
目录
一、使用场景
具体场景(可以拆分):
- 开机立即启动项目
- 项目之间存在强依赖关系,需要按顺序启动
- 项目进程不挂机
案例描述:
- 先启动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
更多推荐
已为社区贡献2条内容
所有评论(0)