前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shell tee 妙用

Shell tee 妙用

作者头像
Lucifer三思而后行
发布2021-08-17 15:28:56
6360
发布2021-08-17 15:28:56
举报
文章被收录于专栏:公众号:Lucifer三思而后行

一、问题发生:

近期在写脚本实现ORACLE一键安装单机11G/12C/18C/19C并建库脚本(shell),期间在测试11G、12C时遇到了一个问题,执行安装命令时:

代码语言:javascript
复制
runInstaller -silent -force -ignoreSysPrereqs -responseFile ${SOFTWAREDIR}/db.rsp -ignorePrereq

安装进程不会等待安装完成再继续执行下一步操作,而是进入后台进程进行安装,直接执行下一步的命令,导致安装失败。

二、思考以及解决:

为此,我想出几个解决方向:

1.通过expec交互命令去监控,太麻烦,未能付诸实践。

2.通过read -p增加一个提示,人为判断安装成功后,回车继续下一步。

代码语言:javascript
复制
if [ "${DB_VERSION}" = "11.2.0.4" ] || [ "${DB_VERSION}" = "12.2.0.1" ]; then
        echo "Oracle Software Install Starting......"
        echo
        echo
        sleep 20
        echo
        echo
        echo "When Successfully Setup Software Apper. Then Press Enter continue." 
        echo
        echo
        read -p "Please Don't Press Enter. Now Waiting..........."
        echo
fi

缺点:这个方法实现简单,但是有违我脚本全自动的初衷。

3.通过写日志,然后while do去grep循环获取日志,每隔5秒搜索一次,当获取到Successfully Setup Software时break退出,继续执行下一步。

代码语言:javascript
复制
su - oracle -c "${SOFTWAREDIR}/database/runInstaller -silent -force -ignoreSysPrereqs -responseFile ${SOFTWAREDIR}/db.rsp -ignorePrereq" >>${SOFTWAREDIR}/setupDatabase.out
echo
echo
sleep 20
echo "Oracle Software Install Starting......"
echo
echo		
while true; do
    echo -n "."
    sleep 5s
    grep "Successfully Setup Software" ${SOFTWAREDIR}/setupDatabase.out >>/dev/null
    if [ $? -eq 0 ]; then
        echo
        echo
        c1 "Successfully Setup Software." blue
        break
    fi
done

缺点:这个方法实现了自动化,并且可以成功执行。但是,安装日志无法输出到控制台,都写入到日志中了,如果安装失败也没法知道,会一直无限循环,需要去手动查看安装日志setupDatabase.out判断是否成功,不直观。

4.经过以上的思路,接下来我只需要实现,在将日志输入到日志的同时,不影响控制台输出即可,所以我就想到了 tee 命令,修改3的脚本:

代码语言:javascript
复制
su - oracle -c "${SOFTWAREDIR}/database/runInstaller -silent -force -ignoreSysPrereqs -responseFile ${SOFTWAREDIR}/db.rsp -ignorePrereq" | tee ${SOFTWAREDIR}/setupDatabase.out
		
while true; do
    echo -n "."
    sleep 5s
    grep "Successfully Setup Software" ${SOFTWAREDIR}/setupDatabase.out >>/dev/null
    if [ $? -eq 0 ]; then
        echo
        echo
        c1 "Successfully Setup Software." blue
        break
    fi
done

结果测试时,惊喜的发现while判断是在安装命令执行成功后才执行的,于是继续修改脚本为:

代码语言:javascript
复制
if [[ "${DB_VERSION}" = "12.2.0.1" ]] || [[ "${DB_VERSION}" = "11.2.0.4" ]]; then
        su - oracle -c "${SOFTWAREDIR}/database/runInstaller -silent -force -ignoreSysPrereqs -responseFile ${SOFTWAREDIR}/db.rsp -ignorePrereq" |tee ${SOFTWAREDIR}/setupDatabase.out
		rm -rf ${SOFTWAREDIR}/setupDatabase.out
fi

继续测试,命令成功执行,完成安装,达到用户无感知,安装结果如下:

撒花✿✿ヽ(°▽°)ノ✿,庆祝!!!

由此,可以推测出:tee 命令时可以阻止程序后台运行。

三、关于tee命令可参考:

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、问题发生:
  • 二、思考以及解决:
    • 为此,我想出几个解决方向:
      • 1.通过expec交互命令去监控,太麻烦,未能付诸实践。
      • 2.通过read -p增加一个提示,人为判断安装成功后,回车继续下一步。
      • 3.通过写日志,然后while do去grep循环获取日志,每隔5秒搜索一次,当获取到Successfully Setup Software时break退出,继续执行下一步。
      • 4.经过以上的思路,接下来我只需要实现,在将日志输入到日志的同时,不影响控制台输出即可,所以我就想到了 tee 命令,修改3的脚本:
  • 三、关于tee命令可参考:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档