`
cantellow
  • 浏览: 847217 次
  • 性别: Icon_minigender_1
  • 来自: 草帽海贼团
社区版块
存档分类
最新评论

一个实现cpu load预警的shell脚本

 
阅读更多

由于项目组的需要,最近用bash shell实现了cpu load预警的脚本,之前完全没有过shell的经验,甚至连linux的经验也基本为零,所以写了一天多的时间算是勉强完成,关键地方还是别人指导的,实在是惭愧。其逻辑很简单,就是获取当前cpu load,如果超过预定的值,就会发送邮件或者短信报告相关人员。

 

#!/bin/bash
#cpu load / cpu count load和cpu个数的比值
cpu_load_threshold=1.50

now_time=`date +"%Y-%m-%d-%H:%M:%S"`

ip=`/sbin/ifconfig | grep inet | awk '{print $2 }' | cut -d: -f2 | sed -n '2p'`

cpu_nums=`cat /proc/cpuinfo | grep "processor"|wc -l`

load_average=`w | grep 'average' | cut -d',' -f4 | cut -d':' -f2 | cut -d' ' -f2`

load5=`w | grep 'average' | cut -d',' -f5 | cut -d' ' -f2`

load15=`w | grep 'average' | cut -d',' -f6 | cut -d' ' -f2`

threshold=`awk 'BEGIN{printf "%.4f\n","'"$load_average"'"/"'"$cpu_nums"'"}'`

if [ $threshold \> $cpu_load_threshold ]
then
 msg="cpu%20load%20alarm""[${load_average},${load5},${load15}]%20""${now_time}%20""${ip}%20""CPUCount""${cpu_nums}"
# echo "the mail send begin..."
# echo -e "$msg" > mail.txt
# mail -s "cpu load alarm" xxx.com < mail.txt
# echo "the mail send end..."

#sms list
 echo "the sms send begin..."
 #短信发送的实现
 echo "the sms send end..."

fi

 如果用java实现,恐怕不到半天就可以搞定,我特别讨厌shell的语法,乱七八糟的字符,毫无代码质量可言,出现了错误也找不出问题。可能是java先入为主的原因,不过多学一种工具终究是好的。

shell一些基本的语法

Bash shell中对变量的赋值不能有空格,有空格的话,它会把它当做命令:

比如:

[root@SJSWT36-139 ~]# a =5

-bash: a: command not found

[root@SJSWT36-139 ~]# a= 5

-bash: 5: command not found

如果你要想将一个命令执行返回的结果赋给一个变量的话,你可能会写成a= w

但实际上a没有得到w命令的结果,这条语句只是简单的执行了w,要想将其结果赋值给a,可以采用`command` 倒引号:a=`w`

 

shell中,空格很重要,比如if语句中括号前后都要有空格才行,遇到错误的时候也要想一下是不是空格的问题。

 

shell中,没有>符号,如果要使用>,需要转义:\>

 

shell中的单引号和双引号:

被单引号用括住的内容,将被视为单一字串。在引号内的代表变数的$符号,没有作用,也就是说,他被视为一般符号处理,防止任何变量替换。

被双引号用括住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。这点与单引数的处理方式不同。

 

而在awk中,却有所不同:

awk 'BEGIN{printf "%.2f\n",$a/$b}'awk 'BEGIN{printf "%.2f\n","$a"/"$b"}'都是不对的

而是awk 'BEGIN{printf "%.2f\n",'$a'/'$b'}',因为外面也有一个单引号,所以为了避免重复,可以将中间的单引号转义:

awk 'BEGIN{printf "%.2f\n","'"$a"'"/"'"$b"'"}'

CPU LOAD

Load 就是对计算机干活多少的度量(WikiPedia: the system load is a measure of the amount of work that a computer system is doing)。也有简单的说是进程队列的长度. Load Average 就是一段时间 (1 分钟、5分钟、15分钟) 内平均 Load 。【最好的参考文章:UNIX® Load Average Part 1: How It Works

load的刷新频率

load并不是上面说所的1 分钟、5分钟、15分钟刷新一次,而是5秒钟刷新一次(CALC_LOAD 每5HZ计算一次, 5HZ 为 5秒钟,这里的 HZ是系统定义的变量),所以你不能精确获取当前load,也会遇到这种情况:当你收到load短信预警但是马上去查看的时候却不是那个值。

cpu使用率和cpu load

cpu使用率很高,cpu load不一定很高,同样,cpu load很高,cpu使用率不一定很高,比如队列里都是网络或者I/O任务,所以不能简单的认为短时间cpu load很高就是cpu处理能力不行。

Load 高只是代表需要运行的队列累积过多了。但队列中的任务实际可能是耗 CPU的,也可能是耗 I/O 乃至其它因素的。

分享到:
评论
1 楼 greatwqs 2011-10-25  
可怜   现在我们公司不用linux   想起在以前维护的几台生产环境的服务器了

相关推荐

    向shell或者sql脚本传参或接收参数的方法

    在命令行中,你可以像这样执行一个Shell脚本,并传递参数: ```bash sh a.sh aaa bbb &gt; a.log ``` 在这个例子中,`aaa`和`bbb`就是传递给`a.sh`的参数,`&gt;`符号用于重定向标准输出到`a.log`文件。在`a.sh`脚本内部...

    Shell脚本搭建FTP服务器(vsftpd)

    在配置PAM(Pluggable Authentication Modules)文件时,脚本创建了一个名为`pam.d/vsftpd.virtual`的文件,它定义了vsftpd服务如何处理认证和账户管理。这一步骤对于确保FTP服务器的安全性至关重要,因为它决定了...

    通过shell脚本连接oracle数据库客户端oracle-instantclient11.2-basic-11.2

    假设你有一个名为`data.csv`的CSV文件,你想要将其导入到名为`your_table`的表中,可以创建一个名为`import_data.sh`的shell脚本: ```bash #!/bin/bash sqlldr username/password@//hostname:port/service_name ...

    Linux下mysql数据库备份以及恢复shell脚本

    本篇将详细阐述如何使用Shell脚本来实现MySQL数据库的备份与恢复。 首先,让我们分析提供的两个脚本文件: 1. `datarestore.sh`:这个脚本通常用于执行数据库恢复操作。它可能包含了连接到MySQL服务器,选择要恢复...

    Shell脚本—判断循环

    - PID:进程ID,用于唯一标识一个进程。 - VSZ/RSS:进程在内存中的虚拟/实际使用量。 - TIME/CMD:进程所消耗的累计CPU时间和启动该进程的命令。 - STAT:进程状态,如S(睡眠)、R(运行)、Z(僵尸)等。 - ...

    获取磁盘IO与系统负载Load的shell脚本

    ### 获取磁盘IO与系统负载Load的Shell脚本解析 #### 一、系统负载信息提取脚本 在IT运维管理中,系统负载信息是衡量服务器性能的重要指标之一,它可以帮助我们了解系统的运行状态,及时发现并解决问题。下面的...

    CPU负载监控脚本代码.docx

    Shell脚本是一种特殊的编程语言,用于在Unix/Linux系统中执行命令和自动化任务。 2. 系统命令:该脚本使用了多个系统命令,例如`uptime`、`date`、`ifconfig`、`grep`、`awk`、`cut`和`bc`。这些命令用于获取系统...

    Linux内核分析:页回收导致的cpu load瞬间飙高的问题分析与思考.pdf

    Linux内核分析是系统开发和维护中非常重要的一部分,本文将讨论Linux内核在页回收时出现的cpu load瞬间飙高的问题,并探讨可能的原因和解决方案。 页回收是操作系统中非常重要的一部分,它是操作系统管理物理内存的...

    dbload大批量导入数据 shell脚本 根据表列表文件导入 速度超快

    首先,`dbload.sh`是一个shell脚本,它在Unix/Linux环境中运行,用于驱动`dbload`工具执行数据导入任务。编写这样的脚本可以使数据导入过程更加灵活和可控,比如根据不同的需求调整导入参数或者处理不同来源的数据...

    如何用10行bash shell脚本监控Linux.docx

    本文将介绍如何使用 10 行 Bash shell 脚本来监控 Linux 系统的资源,包括内存、磁盘和 CPU 的使用情况。 监控内存 在 Linux 系统中,`free -m` 命令可以显示系统的内存使用情况。使用 `awk` 命令可以从输出中提取...

    javaAgent实现补丁不重出功能,通过attach实现程序运行时加载,同时通过shell脚本部署到容器内

    当一个JavaAgent被加载时,JVM会调用`premain`方法,并传递一个`Instrumentation`实例,我们可以用这个实例来实现字节码的修改。例如,我们可以使用ASM、ByteBuddy或javassist等字节码库来进行增强。 对于"补丁不重...

    linux系统命令及shell脚本实践指南

    - 示例:创建一个监控CPU使用率的脚本。 ```bash #!/bin/bash while true; do top -bn1 | grep load | awk '{print $(NF-2)}' | sed 's/,//g' sleep 5 done ``` 5. **自动化部署** - 示例:构建一个自动化...

    项目压力测试文件(cpuload)

    6. **load.php**:这个名字暗示了这是一个用于执行负载测试的脚本,它可能会启动或调度一系列操作来生成特定的CPU负载模式。 7. **cancel-cpu-load.php**:与cancel.php类似,此文件可能用于取消或停止由put-cpu-...

    运维相关常用shell脚本.zip

    运维相关常用shell脚本.zip ...2. 查看系统状态的脚本:cpu、disk、iostat、load、memory、swap、vmstat 等 3. 安装 mariadb 的脚本 4. 安装 keeplived 的脚本 5. 安装 golang 的脚本 6. 安装 elk 脚本 7. 磁盘分区脚本

    linux-使用简单的shell脚本来调整MacOS以符合个人的喜好

    一个Shell脚本通常以`#!/bin/bash`作为第一行,这告诉系统使用Bash shell来执行接下来的指令。然后,你可以写入一系列的命令,用换行符分隔,或者使用分号在同一行内分隔多个命令。 例如,你可以创建一个脚本来自动...

    ANSYS workbench脚本开发指南

    用户可以使用 ANSYS Workbench 对象、单位、文件路径处理等来实现脚本的自动化。 已知的问题和限制 在使用 ANSYS Workbench 脚本开发时,需要注意的一些已知的问题和限制。用户需要了解这些问题和限制,以便更好地...

    shell_script.zip

    3. **脚本结构**:一个典型的Shell脚本会包含变量定义、条件语句(if/else)、循环结构(for/while)、函数定义以及调用系统命令。例如,`aia_src_cur_copy_01.sh`可能用于从源目录复制当前文件到目标位置。 4. **...

    linux下shell脚本的QT翻译工具的使用,生成ts和qm

    例如,可以写一个脚本定期调用`lupdate`和`lrelease`命令,并集成到持续集成/持续部署(CI/CD)流程中。 7. **总结**: 在Linux下,利用shell脚本配合Qt的工具,可以有效地管理和更新Qt应用的国际化资源。通过创建和...

    Sybase IQ的数据同步shell代码 load

    在IT行业中,数据同步是一...总的来说,Sybase IQ的数据同步涉及`option`导出和`load`导入,结合shell脚本可以实现自动化,简化操作流程。通过理解和熟练运用这些工具,能够有效地管理和维护大数据环境中的数据一致性。

Global site tag (gtag.js) - Google Analytics