分享

shell awk 检查程序是否执行

fc013 发表于 2016-2-14 14:49:19 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 11660

问题导读:

1.Linux中怎样判断某一进程是不是运行?
2.Linux中怎样倒排序查看,服务器各类进程数?
3.Linux中怎样利用awk检查程序是否执行?




通过shell结合awk可以很好判断某一进程是不是运行,或者某一程序文件是否被执行,下面以php为例来说明一下。
定义一个crontab,每一分钟执行一次,时间间隔为一分钟,可能下一次执行的时候,上次还没有执行完,所以我们要做一下判断。

一、test.php在运行的情况,查看进程
[mw_shl_code=bash,true]# ps -ef |grep test.php
root     29884 29881  0 10:48 ?        00:00:00 awk NR==1{\?if ($8 == "grep"){\?system("cd /home/test/cron && php test.php");\?}else{\?print "running";\?}\?}
root     29888 29884  0 10:48 ?        00:00:00 sh -c cd /home/test/cron && php test.php
root     29889 29888  1 10:48 ?        00:00:00 php test.php
root     30265  7620  0 10:48 pts/0    00:00:00 grep test.php[/mw_shl_code]

二、test.php不在运行的情况,如下
[mw_shl_code=bash,true]# ps -ef |grep test.php
root     30265  7620  0 10:48 pts/0    00:00:00 grep test.php[/mw_shl_code]

三、test.sh脚本如下
[mw_shl_code=bash,true]# cat test.sh
ps -ef|grep test.php | awk 'NR==1{\
if ($8 == "grep"){\
system("cd /home/test/cron && php test.php");\
}else{\
print "running";\
}\
}'

exit;[/mw_shl_code]

ps -ef|grep test.php,当第8列等于grep的时候,test.php是没有运行的,system调用php执行test.php,反之在运行。

四、实际运行的情况

执行test.sh后,一天差不多,会出现一次这样的情况,

[mw_shl_code=bash,true]# ps -ef |grep test.php
root      8043  8040  0 09:33 ?        00:00:00 awk NR==1{\?if ($8 == "grep"){\?system("cd /home/test/cron && php test.php");\?}else{\?print "running";\?}\?}
root      8044  8043  0 09:33 ?        00:00:00 sh -c cd /home/test/cron && php test.php
root      8045  8044  0 09:33 ?        00:00:00 php test.php
root     18952 18947  0 Oct14 ?        00:00:00 awk NR==1{\?if ($8 == "grep"){\?system("cd /home/test/cron && php test.php");\?}else{\?print "running";\?}\?}
root     18954 18952  0 Oct14 ?        00:00:00 sh -c cd /home/test/cron && php test.php
root     18955 18954  0 Oct14 ?        00:00:01 php test.php
root     23430 23410  0 10:32 pts/0    00:00:00 grep test.php[/mw_shl_code]

然后导致php程序卡死,一直没有搞清楚,为什么会这样。

五、解决办法
[mw_shl_code=bash,true]# cat t.sh
t=0
eval $(ps -ef |grep test.php |awk 'BEGIN {t = 0;}{if ( $8 == "php"){t++;}}END{print "t="t;}');

if [ $t -gt 1 ]
then
kill -9 $(ps -ef |grep test.php |awk '{L[NR]=$2;a[NR]=$8;}END{for (i=1;i<=NR;i++){if(a != "grep"){print L;}}}');
else
echo "$t no killing";
fi

exit;[/mw_shl_code]


t.sh的意思,每隔一段时间检查一下,test.php正在被执行的次数,如果大于1,就强行结束掉,所有根test.php有关的进程。


六、awk查看,倒排序查看,服务器各类进程数

[mw_shl_code=bash,true]# ps -ef| awk '{a[$8]++}END{for(i in a){print i,a | "sort -r -k 2"}}'[/mw_shl_code]



已有(1)人评论

跳转到指定楼层
a_zhen 发表于 2016-2-15 10:10:59
shell脚本还不精通,值得一看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条