背景
最近做雲上平台虛機整改,要求應用能開機自啟動。切換某子產品時發現主機重新開機後應用為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
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLi0zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xCNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLjRGOiZWY0IDNlZjNiN2MwUTM2cDNjdjM3Y2MiRDM5cDNkFmYxkzLcJTMxIDMy8CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
建立模拟自啟動腳本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