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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

shell脚本执行kill命令后自动停止的问题

参考技术A 背景:每周重启jenkins

所以写了一个脚本,命名为 auto_restart_jenkins.sh

其中里面包含了一个kill命令:ps -ef | grep jenkins | grep -v grep | awk 'print "kill -9 "$2' | sh

但是每次执行到这一步的时候整个shell脚本就被kill掉了。

原因:因为shell脚本名中包含了jenkins,所以在执行kill命令的时候,也就把shell脚本kill掉了。

最后,改一下shell脚本名就好了,不要包含jenkins

或者在shell脚本中添加参数 export BUILD_ID=dontKillMe

以上是关于shell 脚本检测当前脚本已在执行则kill的主要内容,如果未能解决你的问题,请参考以下文章

Linux定时执行shell

如何检测我运行 shell 脚本的当前目录?

Shell语法——参数变量,测试与比较

Shell命令脚本。

shell 判断后台是不是有任务执行 fg

linux脚本后台运行