菜单式Shell运维脚本调试小记

今天上午,同事叫我帮他看下他正在写的脚本到底哪里出了问题,执行总是达不到预期功能。于是ssh连过去看能否发现问题,经过多次Debug定位与排除,问题终于得到解决。

 

同事在网上down了一个脚本菜单模板,想把我们已经存在的功能脚本整合到一起,做成多功能的Linux运维工具。目前已经添加了挺多功能,而早上才添加的一个抓取高占用CPU的Java线程功能时出现了无法出现交互界面的问题,而单独去执行这个子脚本又是正常的。

我将这个案子拿到手之后,第一件事就是打开了主菜单,分析了一下菜单功能原理和大致结构。通过断点定位法我找到问题出现的位置:

这是主菜单调用子脚本关键代码:

我在子脚本调用的前面加入了 echo $run,用来确定脚本是否运行到了此处、变量内容是否是我们所预期的。

执行后,打印结果如下:

看到第一行后面的 &符号,再打开如下的子菜单查看,立马得出结论:原来是同事编写的子菜单格式兼容性存在问题,他在每个调用子脚本语句后面加了后台运行标识符 &

有了这个&标识符,调用的脚本将置于后台执行,之所以前15项都能正常,唯独第16项有问题,是因为这项功能存在read交互语句,如第9、13行:

将其置于后台运行,read -p的显示根本都看不到,焉能交互?! 终于抓到了“元凶”,就是置于后台运行的方式存在问题,它不兼容执行中需要交互的脚本。直接在vim中将&批量删除,保存后立竿见影!

正确的写法应该是:

虽然就是这样一个小问题,但是200多行的主菜单脚本,还不是我写的,不仔细分析一下真的很难找到原因!空闲时间,我又回头观赏了一下这个工具菜单逻辑结构,感觉设计的不错,功能的添加非常灵活,值得借鉴,等完善之后,我会在博客记录分享一下!

发表评论

gravatar

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen:

刷新评论

目前评论:6   其中:访客  3   博主  3

  1. 彼岸时光网 4 来自天朝的朋友 未知浏览器 Unknow Os 云南省昆明市 电信

    表示对这些不是很懂。。。呵呵~

    • 张戈 [博主] 来自天朝的朋友 未知浏览器 Unknow Os 广东省深圳市 电信

      你懂PHP、CSS、…就已经比我好多了。

      • 彼岸时光网 4 来自天朝的朋友 未知浏览器 Unknow Os 云南省昆明市 电信

        也是只兴趣爱好而已了,呵呵。算不上精通,略懂略懂~~~~

        • 张戈 [博主] 来自天朝的朋友 未知浏览器 Unknow Os 广东省深圳市 电信

          都是略懂、略懂。。。

  2. 海滨博客 1 来自天朝的朋友 未知浏览器 Unknow Os 安徽省黄山市 电信

    技术人员 支持

    • 张戈 [博主] 来自天朝的朋友 未知浏览器 Unknow Os 广东省深圳市 电信

      评论” alt=”[握手]” title=”[握手]” class=”ds-smiley” />

加载中,请稍候...