• 云途科技成立于2010年 - 专注全球跨境电商服务器租赁托管!
  • 帮助中心

    您可以通过下方搜索框快速查找您想知道的问题

    shell awk 检查程序是否执行

      in  unix      Tags: 

    通过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"}}'


    • 外贸虚拟主机

      1GB硬盘

      2个独立站点

      1000M带宽

      不限制流量

      美国外贸专用虚拟主机,cPanel面板,每天远程备份.
      服务器配置:2*E5 32核,96GB 内存,4*2TB 硬盘 RAID10 阵列.

      ¥180/年

    • 美国/荷兰外贸VPS

      2核CPU

      1G内存

      30硬盘

      10M带宽

      美国/荷兰外贸云服务器,专注外贸服务器行业12年.
      服务器配置:2*E5 32核,96GB 内存,4*2TB 硬盘 RAID10 阵列.

      ¥99/月

    • 全球外贸服务器

      8核CPU

      32G内存

      1TB硬盘

      1000M带宽

      已部署数据中心:美国洛杉矶/亚特兰大、荷兰、加拿大、英国伦敦、德国、拉脱维亚、瑞典、爱沙尼亚
      自有机柜(全球九大数据中心),稳定在线率:99.9%

      ¥999/月 原价1380

    7*24小时 在线提交工单

    如果您的问题没有得到解决,推荐您在线提交工单,我们的客服人员会第一时间为您解决问题

    展开