zl程序教程

您现在的位置是:首页 >  其他

当前栏目

生产环境自启动失败问题排查

2023-04-18 15:00:30 时间

背景

最近做云上平台虚机整改,要求应用能开机自启动。切换某模块时发现主机重启后应用为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

发现新生成的文件属主为app,符合预期,问题解决

四、总结

在脚本里想切换用户并执行后续操作不能直接使用"su - xxx"然后回车继续写命令方式,正确的方式有两种,一种是前面提到的"su - xxx -c "xxxx"方式,另一种是如下方式(也已验证通过):

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

两种方式可灵活选择