Linux中如何防止一个Shell脚本被重复执行?

问题场景:有时执行任务的频率比较快,并不知道上一个脚本是否真的执行完毕。而导致重复执行几个一样的脚本。

举个栗子:

脚本tim.sh的内容如下:

#/bin/bash
sleep 300 #单位是s,即睡眠300/60s=5min

然后,我们在五分中之内连续执行三次命令:sh tim.sh &

效果如下:


即多次运行脚本,会导致同一脚本重复启动的问题,但是此时业务要求同一时刻只能有一个同样的脚本在运行。

解决方法:

将执行脚本的进程pid保存在某个文件中,每次执行该脚本时,都先去判断该文件是否存在,如果不存在,则利用$$获取当前运行的脚本的进程号保存在指定文件中;如果存在则执行kill该文件中的进程pid号,并删除该pid文件。

脚本tim.sh改写如下:

#!/bin/bash
pidpath=/tmp/tim.pid      #定义pid文件
if [ -f "$pidpath" ]    #如果pid文件存在,则执行then后面的命令
    then
        kill `cat $pidpath`>/dev/null 2>&1 #杀掉与前一个进程对应的进程,其中>/dev/null 2>&1表示:标准输出和标准错误都重定向到了/dev/null
        rm -f $pidpath  #删除pid文件
fi
echo $$ >$pidpath #将当前Shell进程号记录到pid文件中
sleep 300

此时,我们多次执行tim.sh脚本,效果如下:


可以看到,不管我们执行多少次sh tim.sh &,只存在一个脚本tim.sh对应的进程号。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值