生产环境自启动失败问题排查
Posted loong576
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生产环境自启动失败问题排查相关的知识,希望对你有一定的参考价值。
背景
最近做云上平台虚机整改,要求应用能开机自启动。切换某模块时发现主机重启后应用为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
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
发现新生成的文件属主为app,符合预期,问题解决
四、总结
在脚本里想切换用户并执行后续操作不能直接使用"su - xxx"然后回车继续写命令方式,正确的方式有两种,一种是前面提到的"su - xxx -c "xxxx"方式,另一种是如下方式(也已验证通过):
[root@node01 ~/scripts]# more startapp.sh
echo "-------start app1 and app2-------"
su - app <<EOF
mkdir /tmp/test01;
touch /tmp/test.txt;
EO
两种方式可灵活选择
以上是关于生产环境自启动失败问题排查的主要内容,如果未能解决你的问题,请参考以下文章