shell快讲第一节--shell基础
shell快讲第二节--管道与重定向
shell快讲第三节--正则表达式
shell快讲第四节--sed与awk
shell快讲第五节--shell语法基础
shell快讲第六节--shell函数编程
shell快讲第七节--shell编程规范与调试
shell快讲第八节--shell编程实战
shell场景化编程
状态查询类脚本解析
1、进程状态查询,这是我们之前写的一个进程查询类的脚本,SEP是自定义的分隔符,实际写脚本中为了方便被第三方软件采集,自定义分隔符是必要的,当然或许输出不那么好看
#!/bin/bash
#通用的进程查看,提取了最关键的几个维度
#process_name='mysqld'
SEP="@"
checkprocess(){
p_pids=`ps -aux |grep -v grep |grep $1|awk {'print $2'}`
echo "HOSTNAME${SEP}COMMAND${SEP}STAT${SEP}USER${SEP}PID${SEP}CPU${SEP}MEM${SEP}INFO"
if [ -z "$p_pids" ];then
echo "no found process"
else
for p_pid in $p_pids;
do
p_command=`ps -axu |grep -v grep |grep $1 |grep $p_pid |awk {'print $11" "$12'}`
p_stat=`ps -axu |grep -v grep |grep $1 |grep $p_pid |awk {'print $8'}`
p_user=`ps -axu |grep -v grep |grep $1 |grep $p_pid |awk {'print $1'}`
p_cpu=`ps -axu |grep -v grep |grep $1 |grep $p_pid |awk {'print $3'}`
p_mem=`ps -axu |grep -v grep |grep $1 |grep $p_pid |awk {'print $4'}`
# echo 'COMMAND,STAT,USER,PID,CPU,MEM,INFO'
echo "$HOSTNAME${SEP}$p_command${SEP}$p_stat${SEP}$p_user${SEP}$p_pid${SEP}$p_cpu${SEP}$p_mem${SEP}found process $1"
done
fi
}
#checkprocess $process_name
checkprocess @option.process_name@
上面的脚本是我们随手写的,其实也有很多不科学的地方,首先各个采集数据并不是一个cpu时间片下的,大家看下下面,对比下上面的哪里不够科学
SEP="@"
checkprocess(){
p_pids=`ps -aux |grep -v grep |grep $1|awk {'print $2'}`
echo "COMMAND${SEP}STAT${SEP}USER${SEP}CPU${SEP}MEM${SEP}PID${SEP}HOSTNAME${SEP}INFO"
if [ -z "$p_pids" ];then
echo "No found process"
else
for p_pid in $p_pids;
do
a=`ps -axu |grep $1 |grep $p_pid`#这里如果不单独给变量,会被awk带来未知影响,要测试好
echo $a |awk -v pid=$p_pid -v hostname=$HOSTNAME -v i="found telegraf" 'BEGIN{OFS="@"}{print $8,$1,$3,$4,pid,hostname,i}'
done
fi
}
#checkprocess $process_name
checkprocess telegraf
分析:下面的代码所有的采集数据是一个ps命令产生的,相对第一个代码就更科学一点,我们也可以用time命令来测下两个脚本的执行时间损耗
未完待续.....
网友评论