mdm_monitor script

本文介绍了一个用于监控Tomcat应用及系统资源使用情况的bash脚本。该脚本周期性收集Tomcat CPU、内存使用率以及系统CPU、内存占用情况等关键指标,并输出这些数据以便进一步分析。此外,脚本还获取了PermGen空间使用情况。

#!/bin/bash/

vpn_monitor()

{

timing=`date +%F" "%T`

########## These are for tomcat!

tomcat_pid=`ps aux| grep java |grep tomcat|awk {'print $2'}`

top n2 -p $tomcat_pid|grep tomcat|grep java >/tmp/numeric_tomcat

tomcat_cpu_twice=`awk '{a+=$9}END{print a}'/tmp/numeric_tomcat`

tomcat_mem_twice=`awk '{a+=$10}END{print a}'/tmp/numeric_tomcat`

if [ ! $tomcat_pid ]; then

  echo "Tomcat is not in use !"

else

tomcat_cpu=`echo "scale=1;$tomcat_cpu_twice/2"|bc`

tomcat_mem=`echo "scale=1;$tomcat_mem_twice/2"|bc`

fi

 

########## These are for system!

mpstat -P ALL|grep -v all|grep -v CPU|grep -v ^$ >/tmp/mpstatcpu

sys_cpu_idle=`awk '{a+=$10}END{print a}' /tmp/mpstatcpu`

sys_cpu_number=`wc -l /tmp/mpstatcpu |awk '{print $1}'`

sys_cpu_decimal=`echo"scale=1;$sys_cpu_number*100-$sys_cpu_idle"|bc`

sys_cpu=`echo "scale=1;$sys_cpu_decimal/1"|bc`

 

free|grep Mem > /tmp/freemem

total_mem=`awk '{print $2}' /tmp/freemem`

used_mem=`awk '{print $3}' /tmp/freemem`

sys_mem=`echo"scale=1;$used_mem*100/$total_mem"|bc`

 

########## These are for PermGen!

perm_use=`curl -s http://localhost:8080/jmx-gw/java.lang:type=MemoryPool,name=PS%20Perm%20Gen/attributes/Usage`

 

}

 

rm -rf /tmp/numeric_tomcat /tmp/mpstatcpu /tmp/freemem

echo '    "DATE",           "Tomcat_CPU(%)","Tomcat_MEM(%)","System_CPU(%)","System_MEM(%)"        PermGen'

for ((; ;))

do vpn_monitor

echo "$timing,    $tomcat_cpu, $tomcat_mem,  $sys_cpu,  $sys_mem,    $perm_use"

sleep 10

done

在 C 语言中,`#ifndef` 和 `#define` 是预处理指令,常用于防止头文件的重复包含,从而避免重复定义和编译错误。这种机制通常被称为“头文件卫士”(header guard)或“宏卫士”。 ### `#ifndef` 和 `#define` 的作用 1. `#ifndef` 指令用于检查某个宏是否尚未被定义。如果该宏未被定义,则执行后续的代码块;否则,跳过该代码块。 2. `#define` 指令用于定义宏。在头文件中,通常使用 `#ifndef` 和 `#define` 组合来确保头文件中的内容仅被编译一次。 在定义 `MDM_SANTIZIER_ADDR` 和 `MDM_SANTIZIER_SIZE` 的场景中,`#ifndef` 和 `#define` 可能用于确保这些宏常量不会被重复定义。例如: ```c #ifndef MDM_SANTIZIER_H #define MDM_SANTIZIER_H #define MDM_SANTIZIER_ADDR 0x1A2B3C4D #define MDM_SANTIZIER_SIZE 0x1000 #endif // MDM_SANTIZIER_H ``` 在上述代码中: - `#ifndef MDM_SANTIZIER_H` 检查宏 `MDM_SANTIZIER_H` 是否已经定义。如果未定义,则继续执行后续代码。 - `#define MDM_SANTIZIER_H` 定义了宏 `MDM_SANTIZIER_H`,以标记该头文件已经被处理。 - `#define MDM_SANTIZIER_ADDR` 和 `#define MDM_SANTIZIER_SIZE` 分别定义了地址和大小的常量。 - `#endif` 结束预处理条件判断。 这种机制确保了即使该头文件被多个源文件包含,其内容也只会被编译一次,从而避免重复定义的编译错误[^3]。 ### 代码片段的用途 在嵌入式系统或底层开发中,`MDM_SANTIZIER_ADDR` 和 `MDM_SANTIZIER_SIZE` 可能用于定义某个硬件模块(如调制解调器)的内存映射地址和大小。这些宏常量通常用于配置设备驱动程序或内存管理模块,以确保系统正确访问硬件资源。 例如,在设备初始化过程中,这些宏可能用于设置内存区域的访问权限或分配缓冲区: ```c void *modem_base = ioremap(MDM_SANTIZIER_ADDR, MDM_SANTIZIER_SIZE); if (!modem_base) { // 错误处理 } ``` 上述代码中,`ioremap` 函数将物理地址 `MDM_SANTIZIER_ADDR` 映射到内核虚拟地址空间,并使用 `MDM_SANTIZIER_SIZE` 指定映射的内存大小[^1]。 ### 使用 `#ifndef` 和 `#define` 的优势 1. **避免重复定义**:确保宏、结构体、函数声明等仅被定义一次,防止编译器报错。 2. **提高编译效率**:减少重复处理头文件内容的时间,加快编译速度。 3. **增强代码可维护性**:通过清晰的宏卫士命名,提高代码的可读性和可维护性。 ### 示例:头文件卫士的使用 ```c #ifndef _MEMORY_CONFIG_H_ #define _MEMORY_CONFIG_H_ #define MDM_SANTIZIER_ADDR 0x1A2B3C4D #define MDM_SANTIZIER_SIZE 0x1000 #endif // _MEMORY_CONFIG_H_ ``` 在上述代码中,`_MEMORY_CONFIG_H_` 是头文件卫士的宏名称,用于唯一标识该头文件。如果该头文件被多次包含,预处理器会忽略第二次及之后的包含操作,从而避免重复定义的问题。 ### 总结 `#ifndef` 和 `#define` 在 C 语言中的主要作用是防止头文件的重复包含,确保宏、结构体、函数声明等内容仅被定义一次。在定义 `MDM_SANTIZIER_ADDR` 和 `MDM_SANTIZIER_SIZE` 时,这种机制尤为重要,可以有效避免编译错误并提高代码的可维护性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值