IT技术博客大学习 共学习 共进步

如何使用Shell缉拿问题进程

火丁笔记 2013-03-03 22:57:03 浏览 3,801 次

最近公司服务器不太稳定,总是在凌晨某个时段突发高负载情况,因为客观环境比较复杂,所以很难猜测出到底是哪个进程出现了问题,加之故障发生时,通常我在睡觉,等我被报警短信吵醒,通过公司VPN登上服务器的时候,故障多半已经消失了!不过这个问题难不倒一个合格的DevOps,让我写个Shell搞定它。

实际上解决问题的思路非常简单:通过CRON每分钟运行一个Shell,查询系统负载,一旦发现异常,就通过「ps」命令保存进程快照,也可以进一步保存负载,内存等相关的数据,但通常没有必要,因为通过「sar」命令很容易拿到。相关Shell代码如下:

#/bin/bash

LOAD=$(awk '{print $1}' /proc/loadavg)
CPUNUM=$(grep -c processor /proc/cpuinfo)

if [ $(echo "$LOAD > $CPUNUM" | bc) = 1 ]; then
    RESULT=$(ps -eo pcpu,pmem,user,args | awk '$1 > 0' | sort -nr)
    if [ -n "$RESULT" ]; then
        echo "$RESULT" > /var/log/ps.$(date +"%Y%m%d%H%M")
    fi
fi

实际使用时需要注意的地方:首先,要避免日志文件塞满硬盘;其次,因为是通过CRON来执行的,所以可能会漏判,如果强调准确性请自行改写为守护进程方式。

这个Shell实在是太简单了,以至于我本不想专门写一篇文章,不过它却非常实用,帮我解决了大问题,所以还是记录下来,希望它也能助大家一臂之力。

建议继续学习

  1. Linux服务器性能评估 (阅读 9,881)
  2. 你可能不知道的Shell (阅读 8,161)
  3. 在 shell 脚本里打日志 (阅读 6,041)
  4. 面向对象的Shell脚本 (阅读 5,981)
  5. Bash如何取得当前正在执行的脚本的绝对路径? (阅读 5,843)
  6. 使用Shell快捷键助你一臂之力 (阅读 5,384)
  7. Bash Shell 快捷键 (阅读 4,882)
  8. 加密你的shell (阅读 4,843)
  9. shell文件存在相关判断参数 (阅读 4,702)
  10. Unix考古记:一个“遗失”的shell (阅读 4,443)