前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >生产环境自启动失败问题排查

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

作者头像
loong576
发布2021-12-16 08:03:37
4340
发布2021-12-16 08:03:37
举报
文章被收录于专栏:运维ABC运维ABC

背景

最近做云上平台虚机整改,要求应用能开机自启动。切换某模块时发现主机重启后应用为root用户拉起,本文在测试环境复现并记录解决过程。

一、环境模拟

1.新建自启动脚本

代码语言:javascript
复制
[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

代码语言:javascript
复制
[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.重启前系统检查

重启服务器,复现生产遇到的问题,重启前检查:

代码语言:javascript
复制
[root@node01 <sub>]# route -n
[root@node01 </sub>]# cd /tmp
[root@node01 /tmp]# l
生产环境自启动失败问题排查_服务器_02
生产环境自启动失败问题排查_服务器_02

查看路由信息和/tmp目录下的文件

2.重启

代码语言:javascript
复制
[root@node01 ~]# init

重启服务器

3.重启后检查

代码语言:javascript
复制
[root@node01 <sub>]# route -n
[root@node01 </sub>]# cd /tmp
[root@node01 /tmp]# l
生产环境自启动失败问题排查_rc.local_03
生产环境自启动失败问题排查_rc.local_03

发现路由新增正常,两个文件也有生成,但是属主为root,不是希望的app,和生产出现的问题一致。

三、问题排查解决

1.排查思路

路由新增了,而且test01和test.txt两个文件也产生了,证明脚本startall.sh执行没有问题,重点查看脚本startapp.sh。该脚本实现两个功能,一是用户切换,二是新建文件。文件新建成功了,只是是用root新建的,证明"su - app"这段失效了,于是对这段进行改造

2.脚本改造

改造后的脚本:

代码语言:javascript
复制
[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.验证

代码语言:javascript
复制
[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
生产环境自启动失败问题排查_重启_04
生产环境自启动失败问题排查_重启_04

验证前删除路由信息并删除test目录和文件 再次重启并验证

代码语言:javascript
复制
[root@node01 /tmp]# init 6
生产环境自启动失败问题排查_rc.local_05
生产环境自启动失败问题排查_rc.local_05

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

四、总结

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

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

两种方式可灵活选择

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-12-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 一、环境模拟
    • 1.新建自启动脚本
      • 2.新建应用用户app
        • 3.脚本说明
        • 二、生产复现
          • 1.重启前系统检查
            • 2.重启
              • 3.重启后检查
              • 三、问题排查解决
                • 1.排查思路
                  • 2.脚本改造
                    • 3.验证
                    • 四、总结
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档