博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux中如何防止一个Shell脚本被重复执行?
阅读量:4220 次
发布时间:2019-05-26

本文共 687 字,大约阅读时间需要 2 分钟。

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

举个栗子:

脚本tim.sh的内容如下:

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

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

效果如下:

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

解决方法:

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

脚本tim.sh改写如下:

#!/bin/bashpidpath=/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文件fiecho $$ >$pidpath #将当前Shell进程号记录到pid文件中sleep 300

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

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

你可能感兴趣的文章
火狐下easyui1.3.*弹出window框定位不到中间解决把办法
查看>>
Hadoop启动报错NoClassDefFoundError: javax/activation/DataSource解决方案
查看>>
Python爬虫来啦,抓取数据导出到excel,简单明了,强大,直接贴代码
查看>>
Docker拉取镜像失败报错Error response from daemon: Get https://registry-1.docker.io解决办法
查看>>
Hibernate JPA 中配置Ehcache二级缓存
查看>>
IO操作的工具类总结
查看>>
对指定文件或目录进行压缩和解压缩的工具类总结
查看>>
Java中如何遍历Map对象的4种方法
查看>>
Map加锁操作小例子
查看>>
简单了解mysql表分区
查看>>
深入解析MySQL分区(Partition)功能
查看>>
mysql定时任务简单例子
查看>>
JDK8绿色安装详细步骤
查看>>
MySql最简单的触发器例子
查看>>
全选反选按钮简单例子
查看>>
Solr高效率索引查询简介
查看>>
jquery实现在页面上实现tr排序并后台处理详解
查看>>
浅谈jsp、freemarker、velocity区别
查看>>
第三方QQ,Sina登录平台 JS sdk
查看>>
js中的json对象和字符串之间的转化
查看>>