专栏首页张戈的专栏菜单式Shell运维脚本调试小记

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

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

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

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

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

***** 以上略*****
*) run=`awk -F "$MENUCHAR" 'NR=="'$input'"{print $2}' $1`
if [ "`echo $run | awk -F "." '{print $NF}'`" = "$MENUTYPE" ]
        then
               if [ ! -f $MENUPATH/$run ]
                        then
                              echo "ERR-0: 菜單檔 $MENUPATH/$run 不存在..."
                              Enter
               else
                     echo $run  #我调试时新加入的,用于输出具体变量信息
                     Menu $MENUPATH/$run                       
               fi
else
      eval $run
      Enter
fi
;;
*****以下略*****

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

执行后,打印结果如下:

***略***
menu/scripts/jtgrep &    
任意键继续...

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

查看此伺服器的IP地址%menu/scripts/ip &   
查看此伺服器的型號及Serial Number%menu/scripts/productname &   
查看此伺服器的操作系統版本及內核信息%menu/scripts/os &   
查看此伺服器的網卡信息%menu/scripts/eth &   
查看此伺服器的網卡流量%menu/scripts/netflood &   
查看此伺服器的MAC地址%menu/scripts/hwaddr &   
查看此伺服器的內存%menu/scripts/mem &   
查看此伺服器的CPU%menu/scripts/cpu &   
查看此伺服器的硬碟及陣列信息%menu/scripts/disk &   
查看系統當前的平均負載%menu/scripts/uptime &   
查看系統當前用戶登入數%menu/scripts/users &   
查看系統線上運行時間%menu/scripts/onlinetime &   
查看系統的主機名%menu/scripts/hostname &   
查看系統最大文件句柄數%menu/scripts/ulimit &   
查看系統運行的進程信息%menu/scripts/task &   
抓取JAVA佔用CPU高的線程%menu/scripts/jtgrep &

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

#!/bin/bash   
#Program:   
#抓取JAVA佔用CPU高的線程   
#2014/02/24  
  
echo ""  
echo "系統目前運行的JAVA線程PID為:"  
ps aux | grep "java" | grep -v grep | sed 's/pts.*classpath//g' | awk '{print $2,$7}'   
read -p  "請輸入你要查詢的JAVA線程PID的值:" java_pid   
top -Hp $java_pid -d 1 -n 1  
echo "請記住上面佔用CPU資源較大的幾個JAVA線程的PID"  
jstack $java_pid > menu/reports/jstack.log   
read -p "請輸入佔用CPU資源較大的其中一個JAVA線程的PID:" top_pid   
nid=`python -c "print hex($top_pid)"`   
grep -i $nid menu/reports/jstack.log

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

正确的写法应该是:

抓取JAVA佔用CPU高的線程%menu/scripts/jtgrep

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • WordPress后台首页显示RSS错误的解决办法

    这两天,麻烦不断,可能是因为我折腾的比较频繁吧!老是出现奇奇怪怪的问题,而且百度、GG 居然搜不到有用的解决办法!折腾了大半天,终于被我搞定,虽然还是很笨的方法...

    张戈
  • WordPress发布文章主动推送到百度,加快收录保护原创

    工作实在太忙,也没时间打理网站。最近公司额外交待了一些网站 SEO 方面的优化任务让我关注(这就是啥都要会、啥都要做的苦逼运维的真实写照了...)。 于是抽空看...

    张戈
  • Linux在批量服务器管理中实用的PS1命令提示符格式

    作为一个大公司的运维,手头管理了成百上千的服务器是家常便饭,甚至更多。而我们一般都是用跳板机登陆,由于这些机器一般都是克隆或者虚拟化出来的,所以登陆后的命令行提...

    张戈
  • 关于AI芯片,这些头部企业是这么说的

    刚刚落下帷幕的“2018年中国人工智能峰会”活动中,分论坛关于AI芯片的议题引发了多方关注。在AI的第三次浪潮中,摩尔定律再次被唤起,应用端强烈的需求加速AI芯...

    镁客网
  • 如何在你的项目中使用JSR 303 - Bean Validation进行数值校验?

    JSR-303 是 Java EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是hibernate Validator。

    Java后端技术
  • 约束优化(Constrained optimization)

    约束优化(Constrained Optimization),即约束优化问题,是优化问题的分支。它是在一系列约束条件下,寻找一组参数值,使某个或某一组函数的目标...

    easyAI
  • Galera Cluster for MySQL 详解(四)——性能测试

    本篇使用tpcc-mysql压测工具对实验环境的三节点Galera集群进行一系列性能测试。

    用户1148526
  • Kotlin学习日志(四)函数

    函数这个词相信各位不会陌生,而Kotlin中也是使用了众多函数的,正所谓面向函数编程。

    晨曦_LLW
  • IC验证工程师高效战斗手册--接到验证任务与前期高效学习

    前面我们讲了贯穿整个工作始终的提问之道,今天我们一起探讨接到验证任务、以及验证前期如何高效的学习。

    IC验证
  • c# 动态实例化一个泛型类

    我思故我在

扫码关注云+社区

领取腾讯云代金券