使用場景
- 我們的平臺服務(wù)使用
docker
部署,使用docker-compose
進行管理 - 平臺部署到客戶環(huán)境時,一小部分客戶,使用自己機房或單獨的服務(wù)器,并沒有做斷電保護,有時候這臺服務(wù)器會斷電重啟
- 斷電重啟后,我們的平臺服務(wù)要能自動拉起來,為客戶正常提供服務(wù)
- 實現(xiàn)思路很簡單,創(chuàng)建一個平臺維護腳本,開機啟動時自動執(zhí)行
- 首先把平臺服務(wù)的啟動過程,編寫為一個shell腳本,按照一定順序啟動服務(wù)的各個組件
- 然后將此腳本,加入CentOS7的開機啟動項中
平臺重啟腳本
- 先來講一下平臺的重啟腳本
- 由于我們的平臺服務(wù)使用
docker
部署的,首先需要將docker服務(wù),加入開機自啟動
systemctl enable docker
- 然后編寫平臺服務(wù)重啟腳本
docker-restart.sh
,主要是根據(jù)自己的應(yīng)用情況,搞一個啟動順序 - 主要思路是,先啟動各個中間件(
PostgreSQL
、Redis
、kafka
等),再啟動各個應(yīng)用服務(wù),最后再啟動nginx
等其他所有未啟動的服務(wù)
#!/bin/bash
cd /home
echo '當(dāng)前目錄為:'$(pwd)
docker network create signal-network
echo '開始重啟服務(wù)'
echo '當(dāng)前目錄為:'$(pwd)
cd signal/instance/
docker-compose --compatibility up -d postgresql zookeeper redis portainer
echo "為保證中間件創(chuàng)建完成啟動成功,等待5秒"
sleep 5s
echo '開始創(chuàng)建其他需要的容器,請稍等,可能需要幾分鐘'
docker-compose --compatibility up -d keycloak kafka consul consul-config-loader
sleep 15s
docker-compose --compatibility up -d gateway-app unit-app data-center-app
sleep 25s
docker-compose --compatibility up -d
sleep 15s
docker restart nginx
echo '當(dāng)前目錄為:'$(pwd)
echo '所有命令執(zhí)行完成,請稍等1分鐘后,訪問ip地址,查看界面是否正常展示!'
加入開機啟動
- 平臺重啟腳本搞好之后,就需要將這個腳本,加入到開機自啟動里面
- 加入方法很多,我采用的是賦予
/etc/rc.d/rc.local
開機啟動執(zhí)行 權(quán)限,再在里面寫一個執(zhí)行平臺重啟腳本的命令 - 下面的一段,是加到平臺服務(wù)重啟腳本
docker-restart.sh
里面前幾行里面的,第一次部署平臺時,執(zhí)行下這個腳本 - 主要邏輯:根據(jù)文件內(nèi)容,判斷平臺重啟腳本是否已加入開機啟動,如果沒有,則賦予執(zhí)行權(quán)限并加入
if cat '/etc/rc.d/rc.local' | grep "/home/docker-restart" > /dev/null
then
echo "已加入重啟腳本"
else
echo "將docker服務(wù)重啟加入服務(wù)器重啟腳本"
chmod +x /etc/rc.d/rc.local
chmod +x /home/docker-restart.sh
cat >>/etc/rc.d/rc.local<<EOF
sh /home/docker-restart.sh &
EOF
fi
- 注意:在CentOS 7中,系統(tǒng)默認(rèn)不加載
/etc/rc.d/rc.local
文件,需要手動添加開機啟動項來啟動該文件。所以有了這一行,chmod +x /etc/rc.d/rc.local
,保證文件正常加載和執(zhí)行
腳本內(nèi)容詳解
-
docker-restart.sh
就是一個普通的shell腳本,腳本里都是最基礎(chǔ)的一些命令 - 我下面把我的腳本里用到的一些函數(shù)簡單介紹下,包括自己踩得一些坑
判斷文件內(nèi)容是否包含某字符串
- 這個命令很好用,防止執(zhí)行腳本的命令重復(fù)加到開機啟動里面
cat '/etc/rc.d/rc.local' | grep "/home/docker-restart" > /dev/null
cat 'file path and name' | grep "your str" > /dev/null
- 主要使用
cat
和grep
,前面是文件路徑和名稱,我用的絕對路徑;后面是要查找的字符串 - 然后再進行判斷
> /dev/null
,包含則為true,不包含為false
給文件添加可執(zhí)行權(quán)限
-
chmod +x /etc/rc.d/rc.local
這句命令會給/etc/rc.d/rc.local
文件添加可執(zhí)行權(quán)限 - 賦予權(quán)限后,在系統(tǒng)啟動時,系統(tǒng)會自動執(zhí)行該文件中的命令
- 通過給該文件添加可執(zhí)行權(quán)限,可以實現(xiàn)開機自啟動某些自定義命令或服務(wù)
- 但是請注意,該操作需要謹(jǐn)慎處理,避免不必要的安全風(fēng)險或系統(tǒng)故障
給文件結(jié)尾添加內(nèi)容
- 主要是用這幾句命令,在
/etc/rc.d/rc.local
文件最后面追加我們的平臺重啟腳本的執(zhí)行命令 - 主要使用
cat
寫入
cat >>/etc/rc.d/rc.local<<EOF
sh /home/docker-restart.sh &
EOF
-
sh
后面加&
,是為了后臺啟動,不影響開機速度
根據(jù)內(nèi)容刪除文件的指定行
- 查找刪除很有用,可以幫我維護
/etc/rc.d/rc.local
文件的內(nèi)容,修復(fù)錯加的命令語句 - 在早期部署時,重啟腳本還不完善,在
/etc/rc.d/rc.local
添加了錯誤內(nèi)容 - 例如:應(yīng)該是添加
sh /home/docker-restart.sh &
,結(jié)果使用相對位置,錯加了sh /root/docker-restart.sh &
,而文件在home目錄下,開機啟動時執(zhí)行不到,服務(wù)就沒有重啟 - 還有的客戶機器配置比較差,服務(wù)啟動過程較慢,一開始寫入
/etc/rc.d/rc.local
的是sh /home/docker-restart.sh
,沒有后面加&
,導(dǎo)致系統(tǒng)一直在啟動中,客戶看到進度卡死(實際上在啟動平臺)又去重啟 - 因為客戶都是內(nèi)網(wǎng)環(huán)境,也沒有專業(yè)運維,給客戶更新部署時,是提供自帶腳本的部署包??蛻羯蟼魑募?,執(zhí)行腳本即可,讓客戶去使用命令改文件,有點困難
- 需要一個命令,查找指定行,并刪除,這個也有很多方法,我使用的是
sed
if cat '/etc/rc.d/rc.local' | grep "docker-restart" > /dev/null
then
sed -i '/docker-restart/d' /etc/rc.d/rc.local
fi
echo "將docker服務(wù)重啟加入服務(wù)器重啟腳本"
chmod +x /etc/rc.d/rc.local
chmod +x $(pwd)/docker-restart.sh
cat >>/etc/rc.d/rc.local<<EOF
sh $(pwd)/docker-restart.sh &
EOF
文章來源地址http://www.zghlxwxcb.cn/news/detail-511643.html
文章來源:http://www.zghlxwxcb.cn/news/detail-511643.html
到了這里,關(guān)于Linux:將服務(wù)重啟腳本加入CentO7的開機啟動里的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!