卧疾丰暇豫,翰墨时间作。这篇文章主要讲述生产环境自启动失败问题排查相关的知识,希望能为你提供帮助。
背景最近做云上平台虚机整改,要求应用能开机自启动。切换某模块时发现主机重启后应用为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
两种方式可灵活选择
推荐阅读
- Windows网络编程的一个调试心得
- K8s+Jenkins+GitLab+动态slave-自动化项目部署(详细讲解)
- Android JNI&NDK编程小结及建议
- 整合Apache Hudi+Mysql+FlinkCDC2.1+CDH6.3.0
- Picasso,Glide,Fresco那个好()
- 利用反编译学习Android
- Android自定义控件之基本原理
- 一文带你熟知ForkJoin
- #私藏项目实操分享#Java多线程下载器基础代码