前一阵写了一个/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掉了(还有这种操作?),当然后面服务进程就杀不掉了,但是自己的进程号比服务进程号大的时候,先杀服务进程,后杀他自己,服务进程得以停止。