shell脚本里的ps是真坑

前一阵写了一个/etc/init.d下做启动和停止的脚本,今天发现stop命令突然不行了,代码像下面这样

#停止脚本
stop_script(){

status_script
    if [ ${running} -ne 1 ]
    then
        echo ${0}' no starting '$?...
    else
    PIDS=`ps aux | grep ${MIKKLE_NAME} | grep -v grep |awk '{print $2}'`

    for item in $PIDS
        do
           kill -9 ${item} >/dev/null 2>&1
           echo "Kill pid ${item} .."
        done
      echo 'stop complete'
      return 1
    fi

}

我还很确定这里没什么问题,我把ps那一段拿出来在命令行试了一下,没什么问题 输出了两个进程号,但是我在脚本里用echo测试的时候居然输出了四个值,这是为毛?然后我就找这俩进程号,咋找找不到,我心想我之前用都好使的怎么现在不行了,是不是linux的问题,之后又试了几次都无济于事,在后来我发现,这两个进程号比服务进程号小的时候是不行的,但是比服务进程号大的时候是行的,我突然就意识到---linux没问题是我写的有问题- - ,在之后我还是把awk去掉了 看下到底是什么进程在作祟,输出如下

root 22066 3.0 0.1 196720 25888 pts/1 S 11:19 0:00 preprocess-queue-master
www  22067 0.0 0.0 196720 14248 pts/1 S 11:19 0:00 preprocess-queue-work
root 22074 0.0 0.0 12580 2964 pts/1 S+ 11:19 0:00 /bin/bash /etc/init.d/preprocess-queue stop
root 22079 0.0 0.0 12580 1756 pts/1 S+ 11:19 0:00 /bin/bash /etc/init.d/preprocess-queue stop

我靠,这不狗扥吗,你自己还找你自己,之后把ps那一行改成

PIDS=`ps aux | grep ${MIKKLE_NAME} | grep -v grep | grep -v  /etc/init.d/preprocess-queue |awk '{print $2}'`

就好了。

之后再分析就知道了 ,如果他自己的进程号比服务进程号小,他的进程号先进循环先把他自己kill掉了(还有这种操作?),当然后面服务进程就杀不掉了,但是自己的进程号比服务进程号大的时候,先杀服务进程,后杀他自己,服务进程得以停止。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值