linux 下写 shell kill掉运行时间超过5分钟的PHP进程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 下写 shell kill掉运行时间超过5分钟的PHP进程相关的知识,希望对你有一定的参考价值。

在linux 下,如果我有一个php脚本经常卡住,占用100%的CPU,有没办法可以写个SHELL定时检查一下PHP进程有哪个运行时间超过5分钟的,就KILL掉?

可以的,能根据Cpu累积耗时杀掉程序。
相关进程名字要知道哈。
假设以php进程为名字。
p_name=php
while true
do
sleep 3
#每3秒检查一次。
pro="$(ps -A|grep "$p_name"|head -n1)"
time="$(echo $pro|awk \'
split($3,tab,/:/); if (tab[2]+tab[1]*60>=5) print 1elseprint 0
\')"
#上面那句利用awk判断时间是不是大于5分钟。是则输出1,否则输出0.
pid="$(echo $pro|awk \'print $1\')"
#如果为1 就杀掉那个进程。
if [ $time = \'1\' ]
kill -9 $pid
fi
done追问

你好,
如果我的$p_name = 2.php
ps -A|grep 2.php |head -n1 这句出不来我的2.php的进程ID啊,KILL不掉

而且SHELL有报错
syntax error near unexpected token `fi\'

追答

#!/bin/bash
p_name=vim
while true
do
sleep 3
#每3秒检查一次。
pro="$(ps -A|grep "\\\\"|sort -k3,3|head -n1)"
time="$(echo $pro|awk \'
split($3,tab,/:/); if (tab[2]+tab[1]*60>=5) print 1elseprint 0
\')"
#上面那句利用awk判断时间是不是大于5分钟。是则输出1,否则输出0.
pid="$(echo $pro|awk \'print $1\')"
echo $pid $pro
#如果为1 就杀掉那个进程。
if [ $time = \'1\' ];then
kill -9 $pid
fi
done

我疏忽了,if 少了一个then,还有进程要根据时间排序。否则会堵塞程序。
变量pro本来就不是进程名字哈。我们不需要进程名字。只需要进程号。
pid="$(echo $pro|awk \'print $1\')"

它根据pro变量得到进程ID。
也不是杀不掉,只是你要注意满足条件的进程不多

参考技术A 可以通过php.ini的配置实现,让php脚本最多只能生存5分钟.
修改 : max_execution_time = 300

shell 的话可以用crontab来做,定时检查. 具体的就不会写了~

shell 脚本检测当前脚本已在执行则kill

####实现功能说明:定时任务中每分钟执行该脚本(脚本还有其他功能,没有展示出来)。但是害怕该脚本僵死或者常驻等,所以每次定时任务执行脚本时,都检测是否有该脚本在运行,如果有那就kill掉。
#####脚本部分截取
sh_process=`ps -aux|grep match.sh| grep -v grep|grep -v PPID|awk 'print $2'`
for i in $sh_process
do
echo $i
echo $$
if [ $i == $$ ] ####当前进程则跳过
then
continue
fi
#kill -9 $i
done

运行上面脚本获取到的$i会有两个,例如15259,15260其自身的pid是15259,但是不知道pid15260是什么,如果将kill -9 $i注释打开:提示match.sh: line 24: kill: (15260) - No such process。

参考技术A sh /usr/local/sbin/gdas/start.sh
改为
source /usr/local/sbin/gdas/start.sh
用sh方式去执行就是另开一个shell去跑,相当于是异步的,不等start.sh执行完就执行下面的判断了。用source在当前shell执行该脚本,就是阻塞方式,就不存在此问题了。
建议先手动执行脚本,检验无误了再加入crontab

以上是关于linux 下写 shell kill掉运行时间超过5分钟的PHP进程的主要内容,如果未能解决你的问题,请参考以下文章

如何在windows下写shell脚本

shell 脚本检测当前脚本已在执行则kill

linux内存不足导致java进程被kill掉

我在Linux的主文件夹下写了一个shell script,为啥运行的时候提示:"No such file or directory"

ruby中执行shell命令找到进程并kill掉

shell 判断PID是不是存在,存在则kill掉,不存在则跳过