案例4 小脚本惹出了大麻烦

某银行灾备环境. 运维人员经常需要远程校验灾备端数据的可用性。为了方便日常的常规操作写了专门的启动停止脚本.执行完脚本就登录不上测试主机了.能ping通。运维人员反映,偶尔也会发生这样的问题,一般做法就是要求系统管理员帮他们重新启动分区,听完了,感觉问题好诡异啊。 我们通过HMC登录到分区,AIX运行正常。后来经常一番仔细排查询问找到了"病根".

欢迎大家交流,周四公布原因

[code class=""]#!/bin/sh
su - oracle -c \"/home/oracle/stopdb.sh\"
echo \"Please waitting for 30 seconds...\"
sleep 10
su - oracle -c \"/home/oracle/stopasm.sh\"
/etc/init.cssd stop
/home/oracle/removedev.sh
-----------------------------------------

#!/bin/sh
. /home/oracle/.profile
echo `id`
echo `env|grep ORA`
export ORACLE_SID=scdb
sqlplus '/as sysdba' <shutdown immediate
exit
EOF
lsnrctl stop
------------------------------------------

#!/bin/sh
#umount filesystem
fuser -kux /oracle
umount /oracle

#varyoffvg
varyoffvg oralevg

#exportvg
exportvg oralevg

#rmdev
rmdev -dl hdisk10
rmdev -dl hdisk11
rmdev -dl hdisk12
rmdev -dl hdisk13
rmdev -dl hdisk14
rmdev -dl hdisk15
rmdev -dl hdisk16
rmdev -dl hdisk17
[/code]
参与46

11同行回答

wangs0717wangs0717  系统工程师 , Teamsun
[code class=\"\"]fuser -kux /oracle[/code]显示全部
[code class=\"\"]fuser -kux /oracle[/code]收起
IT咨询服务 · 2016-11-29
浏览2745
  • 确实是这行出了问题,但是这行命令本身没有问题,问题在于()
    2016-11-30
overtopovertop  系统工程师 , 互联网公司
我的看法是:fuser之前应该先退到根目录,以防把自己杀出来,因为之前su到oracle用户,可能已经切到了/oracle目录了。另外脚本停数据库那段,个人认为应该先停监听、再停库更合理(防止依然有连接不能正常停掉数据库)。...显示全部

我的看法是:fuser之前应该先退到根目录,以防把自己杀出来,因为之前su到oracle用户,可能已经切到了/oracle目录了。

另外脚本停数据库那段,个人认为应该先停监听、再停库更合理(防止依然有连接不能正常停掉数据库)。

收起
互联网服务 · 2016-11-30
浏览2853
  • 快说到点子上了
    2016-12-01
  • 是否先停监听都没关系,immediate参数可以保证执行瞬间,会拒绝所有新连接,也会正常关闭所有老连接。
    2016-12-01
nihaoyaof1nihaoyaof1  交互工程师 , bbc
危险命令增加一个判断就ok了,满足条件就执行,不满足条件就不执行。显示全部

Snap1.jpg


危险命令增加一个判断就ok了,满足条件就执行,不满足条件就不执行。

收起
IT咨询服务 · 2016-12-01
浏览2819
myciciymyciciy  IT顾问 , 某金融科技公司
确实是脚本里的这行出问题,不是说这行命令有问题,是每次出现这个问题的时候,运维人员说过,有时候执行脚本停止里面有一些报错,为了保证执行成功,他们又执行了一遍。问题就出在这里,本来第一遍执行的时候/oracle已经被成功umount了,第二次执行的时候就不是/oracle文件系统了,而是一...显示全部

确实是脚本里的这行出问题,不是说这行命令有问题,是每次出现这个问题的时候,运维人员说过,有时候执行脚本停止里面有一些报错,为了保证执行成功,他们又执行了一遍。问题就出在这里,本来第一遍执行的时候/oracle已经被成功umount了,第二次执行的时候就不是/oracle文件系统了,而是一个目录,这个时候fuser会把很多root相关的进行直接kill掉,导致我们无法再登录了。

[code class=\"\"]fuser -kux /oracle[/code]

这个场景很好模拟,找台测试机,执行2遍,效果自然就显现了。

如何解决呢,通过hmc登录到终端重启ssh进程,startsrc -s ssh.虽说这样能够重新登录,但是里面可能有其他的进程没有被重新启动,最安全的办法还是重启一下分区。

收起
银行 · 2016-12-01
浏览2907
  • 在做执行fuser前判断下命令是否存在,不存在就不执行。 写脚本时有时也是需要加写判断的,不然就是命令集合,称不上脚本。
    2016-12-01
nihaoyaof1nihaoyaof1  交互工程师 , bbc
其实在前面已经执行了removedev.sh,不知道什么东西,字面意思像是删除hdisk设备。后面继续做fuser时,/oracle并不代表1个FS,而是/下面的一个子目录而已,fuser -k参数自然连带根也一起kill掉了。...显示全部

其实在前面已经执行了removedev.sh,不知道什么东西,字面意思像是删除hdisk设备。后面继续做fuser时,/oracle并不代表1个FS,而是/下面的一个子目录而已,fuser -k参数自然连带根也一起kill掉了。

收起
IT咨询服务 · 2016-12-01
浏览2794
rockguorockguo  IT顾问 , 江苏巨鸿
没明白,不能登录是指什么不能登录 root telnet不能登录吗 显示全部

没明白,不能登录是指什么不能登录 root telnet不能登录吗

收起
系统集成 · 2016-12-01
浏览2838
小白的踌躇小白的踌躇  系统运维工程师 , 神码
/oracle 是不是fs?显示全部

/oracle 是不是fs?

收起
系统集成 · 2016-12-01
浏览2767
wangqlwangql  系统工程师 , NULL
加个判断好可以使用sh -x调试一下脚本  看看哪段出了问题,我以前做了个db2升级,就遇到升级脚本有问题,通过sh -x诊断出来,自己改的,share一下2.5章节,供大家参考,指正显示全部

加个判断好

可以使用sh -x调试一下脚本  看看哪段出了问题,我以前做了个db2升级,就遇到升级脚本有问题,通过sh -x诊断出来,自己改的,share一下

2.5章节,供大家参考,指正

附件:

附件图标XX电信DB2 v8.1 升级FP18补丁升级方案.doc (223.5 KB)

收起
IT咨询服务 · 2016-12-01
浏览2197
kakakaiikakakaii  项目经理 , 某国企集成商
fuser跑完了,所有进程全杀了是吧显示全部

fuser跑完了,所有进程全杀了是吧

收起
系统集成 · 2016-12-01
浏览2759
powertiandipowertiandi  系统架构师 , 李宁(中国)体育用品有限公司
书写脚本的时候,尤其是多用户的环境,最好是能够明确执行脚本的用户和执行命令时路径,注释要明确,逻辑要清楚一些,写完脚本多测试,最好在脚本开始加set -x选项,观察脚本的执行进度。...显示全部

书写脚本的时候,尤其是多用户的环境,最好是能够明确执行脚本的用户和执行命令时路径,

注释要明确,逻辑要清楚一些,写完脚本多测试,最好在脚本开始加set -x

选项,观察脚本的执行进度。

收起
互联网服务 · 2016-12-01
浏览2781

提问者

myciciy
myciciy21035
IT顾问某金融科技公司
擅长领域: 服务器存储灾备

问题来自

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2016-11-29
  • 关注会员:11 人
  • 问题浏览:10808
  • 最近回答:2016-12-01
  • X社区推广