千家信息网

php脚本执行进程30分钟内不退出的话,就kill掉这些php的脚本进程

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,线上脚本内容如下:[root@localhost ~]# cat /data/scripts/check_php.sh#!/bin/bashDate=`date "+%Y-%m-%d %H:%M:%S
千家信息网最后更新 2025年12月03日php脚本执行进程30分钟内不退出的话,就kill掉这些php的脚本进程

线上脚本内容如下:
[root@localhost ~]# cat /data/scripts/check_php.sh

#!/bin/bashDate=`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.logelse  for i in $Pid    do        echo "$Date Running Process $i"   >> /data/scripts/check_php.log ##define Get Seconds varSec=$(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    donefiecho '===========================' >> /data/scripts/check_php.log

另外一种脚本形式如下:
cat /root/scripts.awk

#!/usr/bin/awk -f  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;    }  }}

脚本分析如下:

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 0614046

awk 字符串处理函数,split

split(s,a,fs)    以fs为分割符 将s字符串分成序列asplit可以实现对字符串进行数组类型的分割,下面用例子来说明下。[root@localhost ~]# echo 'abcd'?| awk '{len=split($0,a,"");for(i=1;i<=len;i++)print "a["i"]="a[i];print "length="len}'a[1]=aa[2]=ba[3]=ca[4]=da[5]=?length=5

解析说明:首先把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 greproot      5493  5490  0 9月18 ?       00:00:00 /bin/bash /data/cron/chksh/setcache.shroot      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

计算进程运行的分钟数:

[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

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

[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 }}}'此时数值都为空

所以此时采用下面的公式计算秒数也为空:

 ps -p33920 h -o etime|awk 'BEGIN { FS = ":" }{if (NF == 3) {split($1, a, "-");if (a[2] != "" ) {print ((a[1]*24+a[2])*60 + $2)*60 + $3}}}'

然而采用下面的公式来计算是正确的:

[root@localhost ~]# ps -p33920 h -o etime|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;}}}'16908
[root@localhost ~]# ps -p33920 h -o etime && ps -p33920 h -o etime|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;}}}'   04:44:18  实际时间格式17058     一共秒数
ps -p 33573  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;}}}
0