天天看點

生産環境自啟動失敗問題排查

背景

最近做雲上平台虛機整改,要求應用能開機自啟動。切換某子產品時發現主機重新開機後應用為root使用者拉起,本文在測試環境複現并記錄解決過程。

一、環境模拟

1.建立自啟動腳本

[root@node01 <sub>]# mkdir scripts
[root@node01 </sub>]# cd scripts/
[root@node01 <sub>/scripts]# touch startall.sh
[root@node01 </sub>/scripts]# touch startapp.sh
[root@node01 <sub>/scripts]# chmod u+x start*
[root@node01 </sub>]# more /etc/rc.local
cd /root/scripts
./startall.sh
[root@node01 ~]# cd /etc/rc.d
[root@node01 /etc/rc.d]# chmod u+x rc.local      
生産環境自啟動失敗問題排查

建立模拟自啟動腳本startall.sh和startapp.sh,注意自啟動檔案/etc/rc.local需要加執行權限

2.建立應用使用者app

[root@node01 <sub>]# useradd app
[root@node01 </sub>]# passwd app
[root@node01 ~]# id app
uid=1000(app) gid=1000(app) 組=1000(app      

建立應用使用者app,模拟生産環境啟動應用的應用使用者

3.腳本說明

伺服器啟動時會加載/etc/rc.local,執行新增路由指令"route add -net 244.0.0.0/24 ens33 "和腳本"startapp.sh"。startapp.sh腳本内容模拟生産上應用使用者app啟動的兩個程序,分别用建立的目錄test01和檔案test.txt替換,若能正常生成檔案且檔案屬主為app:app,則自啟腳本達到目标。

二、生産複現

1.重新開機前系統檢查

重新開機伺服器,複現生産遇到的問題,重新開機前檢查:

[root@node01 <sub>]# route -n
[root@node01 </sub>]# cd /tmp
[root@node01 /tmp]# l      
生産環境自啟動失敗問題排查

檢視路由資訊和/tmp目錄下的檔案

2.重新開機

[root@node01 ~]# init      

重新開機伺服器

3.重新開機後檢查

[root@node01 <sub>]# route -n
[root@node01 </sub>]# cd /tmp
[root@node01 /tmp]# l      
生産環境自啟動失敗問題排查

發現路由新增正常,兩個檔案也有生成,但是屬主為root,不是希望的app,和生産出現的問題一緻。

三、問題排查解決

1.排查思路

路由新增了,而且test01和test.txt兩個檔案也産生了,證明腳本startall.sh執行沒有問題,重點檢視腳本startapp.sh。該腳本實作兩個功能,一是使用者切換,二是建立檔案。檔案建立成功了,隻是是用root建立的,證明"su - app"這段失效了,于是對這段進行改造

2.腳本改造

改造後的腳本:

[root@node01 ~/scripts]# more startapp.sh
#!/bin/bash
echo "-------start app1-------"
su - app -c "mkdir /tmp/test01"
echo "-------start app2-------"
su - app -c "touch /tmp/test.txt      

3.驗證

[root@node01 <sub>]# route delete -net 244.0.0.0/24 ens33
[root@node01 </sub>]# rm -rf /tmp/test*
[root@node01 <sub>]# route -n
[root@node01 </sub>]# cd /tmp
[root@node01 /tmp]# ll|grep tes      
生産環境自啟動失敗問題排查

驗證前删除路由資訊并删除test目錄和檔案

再次重新開機并驗證

[root@node01 /tmp]# init 6      
生産環境自啟動失敗問題排查

四、總結

[root@node01 ~/scripts]# more startapp.sh
#!/bin/bash
echo "-------start app1 and app2-------"
su - app <<EOF 
mkdir /tmp/test01;
touch /tmp/test.txt;
EO      

繼續閱讀