Linux中如何防止一个Shell脚本被重复执行?
2017-07-30 21:39
2046 查看
问题场景:有时执行任务的频率比较快,并不知道上一个脚本是否真的执行完毕。而导致重复执行几个一样的脚本。
举个栗子:
脚本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对应的进程号。
举个栗子:
脚本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对应的进程号。
相关文章推荐
- linux0.11是如何加载并执行一个二进制可执行文件和shell脚本文件的?
- Linux下shell脚本在crontab中一个周期执行不完,下周期任务被重复执行的问题解决
- 在Windows下写了一个shell脚本,上传到Linux下执行时报错
- 每天一个linux命令(62):sh命令 /Linux中执行shell脚本的4种方法总结
- 朋友的一个问题:Linux开机如何自动运行自己编写好的shell脚本
- Linux下如何执行Shell脚本
- linux下如何自动检测并重新启动一个死掉的进程,然后再把它杀死:)(shell脚本实现)
- 防止同一个Java应用重复启动的shell脚本
- 在Windows下写了一个shell脚本,上传到Linux下执行时报错:
- 防止shell脚本重复执行
- ./ . 和#!/bin/bash 辨析Linux如何选择当前执行脚本的shell
- linux下如何自动检测并重新启动一个死掉的进程(shell脚本实现)
- 如何在shell脚本中,判断一个基本命令执行是否成功?
- Linux系列教程(二十)——Linux的shell概述以及如何执行脚本
- Linux下如何执行Shell脚本
- 【Linux】执行shell脚本出现异常:bad interpreter: No such file or directory如何解决
- 在Linux下如何用Shell脚本读写XML?现有一个config.xml(转)
- Linux下如何执行Shell脚本
- 在linux中如何执行自己亲手写的shell脚本?
- ./ . 和#!/bin/bash 辨析Linux如何选择当前执行脚本的shell