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

线上脚本内容如下:
[[email protected] ~]# 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

另外一种脚本形式如下:
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 06
14046

awk 字符串处理函数,split

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

解析说明:首先把abcd换为一个数组,并且数组的分隔符为没有符号,len=split($0,a,"")为获取了整个数组的长度,之后进行输出。在awk中如果是当做字符串输出的字符,全部用双引号来引起来。

查看php脚本运行的时间:

[[email protected] ~]# ps -p 5493  h -o etime
 1-01:35:00
运行了1天1小时35分00秒
根据进程号过滤出具体的运行脚本名称:
[[email protected] ~]# 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

[[email protected] ~]#  ps -p 5493  h -o etime|tail -1
 1-01:40:58

[[email protected] ~]#  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

计算进程运行的分钟数:

[[email protected] ~]# ps -p 5493  h -o etime|tail -1
 1-01:47:56

[[email protected] ~]# 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
计算进程运行的秒数:
[[email protected] ~]# 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

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

[[email protected] ~]# ps -p33920 h -o etime
   04:31:49

[[email protected] ~]# ps -p33920 h -o etime|awk ‘BEGIN { FS = ":" }{if (NF == 3) {split($1, a, "-");if (a[2] != "" ) {print a[1]}}}‘
[[email protected] ~]# ps -p33920 h -o etime|awk ‘BEGIN { FS = ":" }{if (NF == 3) {split($1, a, "-");if (a[2] != "" ) {print a[2]}}}‘
[[email protected] ~]# ps -p33920 h -o etime|awk ‘BEGIN { FS = ":" }{if (NF == 3) {split($1, a, "-");if (a[2] != "" ) {print $2 }}}‘
[[email protected] ~]# 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}}}‘

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

[[email protected] ~]# 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
[[email protected] ~]# 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;}}}

原文地址:https://blog.51cto.com/wujianwei/2455005

时间: 2024-11-11 13:57:12

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

mysql中kill掉所有锁表的进程

转载请保留如下作者信息 作者 : jesse 博客 : http://hi.baidu.com/leechl 3点钟刚睡下, 4点多, 同事打电话告诉我用户数据库挂掉了. 我起床看一下进程列表. mysql>show processlist; 出来哗啦啦好几屏幕的, 没有一千也有几百条, 查询语句把表锁住了, 赶紧找出第一个Locked的thread_id, 在MySQL的shell里面执行. mysql>kill thread_id; kill掉第一个锁表的进程, 依然没有改善. 既然不改善

Linux Shell脚本教程:30分钟玩转Shell脚本编程(笔记)

资料链接 Shell有两种执行命令的方式: 交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条. 批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令. shell脚本有循环和控制语句,为解释执行,不需要编译. 常见的Shell脚本解释器: 有bash.sh.csh.ksh等.我们说的Shell其实是指Shell脚本解释器. bash:Linux默认的shell

找出 alter system kill session ‘sid,serial#’ kill 掉的数据库会话对应进程

当我们使用alter system kill session 'sid,serial#' 在数据库中kill掉某个会话的时候,如果你观察仔细会发现v$session.paddr发生了改变,从而是的不能直接通过关联v$process.add找出spid,然后进行其他操作.本文提供三种方法找该种情况下spid的方法.数据库版本 SQL> select * from v$version; BANNER --------------------------------------------------

Linux每隔1秒kill掉cpu大于50%的进程

1.新建/test/killcpu.sh shell脚本 并授予权限0755#!/bin/bashps axf -o "pid %cpu" | awk '{if($2>=50.0) print $1}' | while read prociddokill -9 $prociddone 2.安装crontabyum -y install vixie-cron3.查看定时任务 crontab -l4.添加定时任务 crontab -e 分 时 日 月 周 命令第1列表示分钟1-59

Shell脚本编程30分钟入门

什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do touch test_$i.txt done 示例解释 第1行:指定脚本解释器,这里是用/bin/sh做解释器的 第2行:切换到当前用户的home目录 第3行:创建一个目录shell_tut 第4行:切换到shell_tut目录 第5行:循环条件,一共循环10次 第6行:创建一个test_1…10.txt文件 第7

shell脚本编程30分钟入门上手

什么是Shell脚本 Shell脚本(英语:Shell script),又称Shell命令稿.程序化脚本,是一种电脑程序与文本文件,内容由一连串的shell命令组成,经由Unix Shell直译其内容后运作.被当成是一种脚本语言来设计,其运作方式与直译语言相当,由Unix shell扮演命令行解释器的角色,在读取shell脚本之后,依序运行其中的shell命令,之后输出结果.利用shell脚本可以进行系统管理,文件操作等. 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell

Linux学习笔记(八)——脚本执行的过程控制

一.   脚本执行过程中的控制 之前的内容中,运行编写好的脚本时都是在命令行上直接确定运行的,并且运行的脚本是实时的,这并不是脚本唯一的运行方式,下面的内容是脚本的其他运行方式.例如在Linux系统中如何控制脚本的执行过程,想在脚本运行过程中对运行中的脚本执行流程进行控制,或者控制脚本的运行时机等等,这些都是通过信号来实现的. 15.1          Linux信号 在Linux系统中,Linux是通过信号和运行在系统上的进程实现通信的.信号就是一个很短的信息,可以发送给一个或多个进程.在前

偷窥篇:重要的C#语言特性——30分钟LINQ教程

本文转自:http://www.cnblogs.com/liulun/archive/2013/02/26/2909985.html 千万别被这个页面的滚动条吓到!!! 我相信你一定能在30分钟之内看完它!!! 在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在foreach一个集合的时候, 也要为遍历的集合的元素,指定变量的类型 隐式类型的出现, 程序员

正则表达式30分钟入门教程

目录 跳过目录 本文目标 如何使用本教程 正则表达式到底是什么东西? 入门 测试正则表达式 元字符 字符转义 重复 字符类 分枝条件 反义 分组 后向引用 零宽断言 负向零宽断言 注释 贪婪与懒惰 处理选项 平衡组/递归匹配 还有些什么东西没提到 联系作者 网上的资源及本文参考文献 更新纪录 本文目标 30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它. 如何使用本教程 最重要的是--请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内