如何确保 Shell 脚本只有一个实例运行

来源:互联网 发布:php xss防御 编辑:程序博客网 时间:2024/05/20 11:22

在做维护的时候,经常要写一些脚本定期检查一些状态信息,而比较糟的时候可能该脚本在执行周期内没完成,接着第二个脚本又开始跑了。如何确保 Shell 脚本只有一个实例运行就成了一个比较有意思的话题。

必需要承认,要做到 100% 的完美可能需要长篇大论才可以做到。如果对于粒度要求不高,这里总结两个粗糙的方法。

一个是在脚本执行的时候判断某个文件的存在,如果不存在,则 touch创建该文件(该文件看作一个"占座"文件),脚本执行完毕的时候删掉。第二个进程如果启动,判断有该文件存在,则退出或者是 sleep几秒钟重新判断。这个方法的关键是在删掉"占座"文件的处理方式上。必需要考虑到程序异常、被 Kill 等多个情况。根据需要 trap 搞一下。

trap 和 kill 命令的 -l 参数能够列出你想要的内容

第二个方法是过滤脚本的名字(当然最好把脚本起个独特一点容易过滤的名字),计数,如果存在一个或者多个 instance , 则退出或者 sleep 等待。否则执行脚本。这个方法最简单,但是移植性似乎要差一点,需要考虑不同平台或 Shell 上的表现。

这两个方法都太粗糙了,经不起考究,但是对于 99% 的系统可能都足够用了。反过来说,如果一个系统对于脚本运行的粒度要求非常高,需要考虑到操作的原子性,那么 Shell 或许并不适合完成这个任务。

解决问题就好,过分炫技不可取。

--EOF--

-------------------------------------------------------我是分割线 ----------------------------------------------

#定义一个标识脚本正在执行的文件名,尽量让这个临时文件名独特#避免与他处指定重名,可借鉴C/C++防止重复包含头文件的宏命名法TMPFILE=/tmp/unmi/backup_oracle_orcl_database.sh.tmp  # BEGIN--检查是否有别的实例在运行,保证同时只能运行一个实例  if[ -e $TMPFILE ]  #判断临时文件是否存在then                   echo "Other instance is running!" #存在表明有一个实例在运行   exit 0           #退出本脚本的执行else   touch $TMPFILE   #监时文件若不存在,就用 touch 新建一个   chmod 600 $TMPFILE #把临时文件属性改为只建立者可读写fi  #用 trap 命令设置一个对信号的监听器#程序运行中当监听到信号 0,1,2,3,9,15就会删除临时文件,并退出脚本执行#比如说,当脚本自行运行结束、被用户 Ctrl+C 掉、被 Kill 掉、终端被关闭#系统关机或重启的情况下,都需将临时文件删除,否则脚本以后都没机会执行#在 Linux 的 shell 下可以运行 trap -l 查看到所以信号trap "rm -f ${TMPFILE}; exit" 0 1 2 3 9 15  # END--检查是否有别的实例在运行,保证同时只能运行一个实例  #下面是这支 Shell 要完成的任务的代码了


0 0