通過shell結合awk可以很好判斷某一進程是不是運行,或者某一程式檔案是否被執行,下面以php為例來說明一下。
定義一個crontab,每一分鐘執行一次,時間間隔為一分鐘,可能下一次執行的時候,上次還沒有執行完,所以我們要做一下判斷。
1,test.php在啟動並執行情況,查看進程
# 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
2,test.php不在啟動並執行情況,如下
# ps -ef |grep test.php
root 30265 7620 0 10:48 pts/0 00:00:00 grep test.php
3,test.sh指令碼如下
查看複製列印?
# 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;
ps -ef|grep test.php,當第8列等於grep的時候,test.php是沒有啟動並執行,system調用php執行test.php,反之在運行。
4,實際啟動並執行情況
執行test.sh後,一天差不多,會出現一次這樣的情況,
# 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
然後導致php程式卡死,一直沒有搞清楚,為什麼會這樣。
5,解決辦法
# 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[i] != "grep"){print L[i];}}}');
else
echo "$t no killing";
fi
exit;
t.sh的意思,每隔一段時間檢查一下,test.php正在被執行的次數,如果大於1,就強行結束掉,所有根test.php有關的進程。
6,awk查看,倒排序查看,伺服器各類進程數
查看複製列印?
# ps -ef| awk '{a[$8]++}END{for(i in a){print i,a[i] | "sort -r -k 2"}}'