php脚本执行进程30分钟内不退出的话,就kill掉这些php的脚本进程
线上脚本内容如下:
[root@localhost ~]# cat /data/scripts/check_php.sh
#!/bin/bash
Date=`date "+%Y-%m-%d %H:%M:%S"`
Num=$(ps -ef|egrep "countjs_syc_site*|countjs_syc_plan*|countjs_syc.php|countjs_syc_img*|setcache*"|grep -v grep |wc -l)
Pid=$(/bin/ps -ef|egrep "countjs_syc_site*|countjs_syc_plan*|countjs_syc.php|countjs_syc_img*|setcache*"|grep -v grep| awk '{print $2}')
if [ $Num -eq 0 ];then
echo "$Date No Process" >> /data/scripts/check_php.log
else
for i in $Pid
do
echo "$Date Running Process $i" >> /data/scripts/check_php.log
##define Get Seconds var
Sec=$(ps -p $i h -o etime|tail -1|awk 'BEGIN { FS = ":" }{if (NF == 2) {print $1*60 + $2 } else if (NF == 3) {split($1, a, "-");if (a[2] != "" ) {print ((a[1]*24+a[2])*60 + $2) * 60 + $3; } else {print ($1*60 + $2) * 60 + $3;}}}')
if [ $Sec -ge 1800 ];then
echo $Date >> /data/scripts/check_php.log
ps -ef | grep $i | grep -v grep >> /data/scripts/check_php.log
kill -9 $i
echo "$Date $i The process runs for more than 30 minutes,The process has been killed." >> /data/scripts/check_php.log
else
echo "$Date $i The process runs in less than 30 minutes" >> /data/scripts/check_php.log
fi
done
fi
echo '===========================' >> /data/scripts/check_php.log
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
另外一种脚本形式如下:
cat /root/scripts.awk
脚本分析如下:
ps -ef|grep 18020 |grep -v grep|awk '{print $2}'; ps -p 18020 h -o etime|tail -1|awk 'BEGIN { FS = ":" }{if (NF == 3) {split($1, a, "-");if (a[2] != "" ) {print ((a[1]*24+a[2])*60 + $2) * 60 + $3; } else {print ($1*60 + $2) * 60 + $3;}}}'
echo " 03:19:15"|awk 'BEGIN { FS = ":" }{if (NF == 3) {split($0, a, ":");if (a[1] != "" ){print a[1],a[2] }}}'
echo " 03:19:15"|awk 'BEGIN { FS = ":" }{if (NF == 3) {split($0, a, ":");if (a[1] != "" ){print a[1],a[3] }}}'
ps -p 18020 -o etime|tail -1|awk 'BEGIN { FS = ":" }{if (NF == 3) {split($0, a, ":");if (a[2] != "" ) {print a[1],a[2],a[3] };{print ($1*60 + $2) * 60 + $3;}}}'
03 54 06
14046
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
awk 字符串处理函数,split
解析说明:首先把abcd换为一个数组,并且数组的分隔符为没有符号,len=split($0,a,“”)为获取了整个数组的长度,之后进行输出。在awk中如果是当做字符串输出的字符,全部用双引号来引起来。
查看php脚本运行的时间:
[root@localhost ~]# ps -p 5493 h -o etime
1-01:35:00
运行了1天1小时35分00秒
根据进程号过滤出具体的运行脚本名称:
[root@localhost ~]# ps -ef|grep 5493|grep -v grep
root 5493 5490 0 9月18 ? 00:00:00 /bin/bash /data/cron/chksh/setcache.sh
root 5506 5493 0 9月18 ? 00:00:00 /usr/bin/php /data/cron/ptask/setcache.php
[root@localhost ~]# ps -p 5493 h -o etime|tail -1
1-01:40:58
[root@localhost ~]# ps -p 5493 h -o etime|tail -1|awk 'BEGIN { FS = ":" }{if (NF == 3) {split($1, a, "-");if (a[2] != "" ) {print a[1],a[2],a[3]}}}'
1 01
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
计算进程运行的分钟数:
[root@localhost ~]# ps -p 5493 h -o etime|tail -1
1-01:47:56
[root@localhost ~]# ps -p 5493 h -o etime|tail -1|awk 'BEGIN { FS = ":" }{if (NF == 3) {split($1, a, "-");if (a[2] != "" ) {print ((a[1]*24+a[2])*60 + $2)}}}'
1547
计算进程运行的秒数:
[root@localhost ~]# ps -p 5493 h -o etime|tail -1|awk 'BEGIN { FS = ":" }{if (NF == 3) {split($1, a, "-");if (a[2] != "" ) {print ((a[1]*24+a[2])*60 + $2)*60 + $3}}}'
93036
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[root@localhost ~]# ps -p33920 h -o etime
04:31:49
[root@localhost ~]# ps -p33920 h -o etime|awk 'BEGIN { FS = ":" }{if (NF == 3) {split($1, a, "-");if (a[2] != "" ) {print a[1]}}}'
[root@localhost ~]# ps -p33920 h -o etime|awk 'BEGIN { FS = ":" }{if (NF == 3) {split($1, a, "-");if (a[2] != "" ) {print a[2]}}}'
[root@localhost ~]# ps -p33920 h -o etime|awk 'BEGIN { FS = ":" }{if (NF == 3) {split($1, a, "-");if (a[2] != "" ) {print $2 }}}'
[root@localhost ~]# ps -p33920 h -o etime|awk 'BEGIN { FS = ":" }{if (NF == 3) {split($1, a, "-");if (a[2] != "" ) {print $3 }}}'
此时数值都为空
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
所以此时采用下面的公式计算秒数也为空:
然而采用下面的公式来计算是正确的: