shell 单实例(1)


一、问题

      使该shell脚本正在运行的进程只有一个,确保部分操作的安全性。特别在系统维护脚本,前一个脚本还没完成,后一个检测时间到了,则同一脚本会执行多次。


二、详解


(1)临时文件

[html] view plain copy
  1. #!/bin/sh  
  2.   
  3. LOCKFILE="/tmp/autosetup.tmp"   #判断临时文件是否存在  
  4.   
  5. trap 'echo "rm lockfile!";rm -f ${LOCKFILE}; exit' 1 2 3 9 15  
  6. #用 trap 命令设置一个对信号的监听器  
  7. #程序运行中当监听到信号 1,2,3,9,15就会删除临时文件,并退出脚本执行  
  8. #比如说,当脚本自行运行结束、被用户 Ctrl+C 掉、被 Kill 掉、终端被关闭  
  9. #系统关机或重启的情况下,都需将临时文件删除,否则脚本以后都没机会执行  
  10. #在 Linux 的 shell 下可以运行 trap -l 查看到所以信号  
  11.   
  12. if [ -f $LOCKFILE ]; then  
  13.     echo "Instance is running!" #存在表明有一个实例在运行  
  14.     exit 0                      #退出本脚本的执行  
  15. else  
  16.     touch $LOCKFILE             #touch新建一个监时文件  
  17.     chmod 600 $LOCKFILE         #把临时文件属性改为只建立者可读写  
  18.     echo "touch successeed!"  
  19.     sleep 10  
  20.     echo "finish!"  
  21. fi  
  22.   
  23. rm -f ${LOCKFILE}               #正常退出  
将sleep换成应该执行的函数或数据操作即可。

上图分别为Ctrl+c中断删除tmp文件、kill中断删除tmp文件、两个进程同时运行只允许一个。


(2)查看进程

[html] view plain copy
  1. #!/bin/bash  
  2. ScriptName=`basename $0`  
  3. #basename,返回一个字符串参数的基本文件名称  
  4. #pidof -x,找出shell脚本script的进程PID,全部列出进程PID  
  5. if [ `pidof -x $ScriptName | wc -w` -gt 2 ]; then  
  6.   echo "Instance is running!"  
  7.   exit 0  
  8. else  
  9.   sleep 10      #执行程序   
  10. fi  
比使用tmp的lock文件简单,但脚本文件名必须是唯一的,否则会错误判断导致无法启动脚本。

注意:以下代码导致脚本始终无法运行,因为启动一个进程后在ps中就有一个,无法检测。

[html] view plain copy
  1. #!/bin/bash  
  2. ps -ef | grep autosetup.sh | grep -v grep > /dev/null  
  3. if [ $? -eq 0 ];then  
  4.     echo "Instance is running!"  
  5.     exit 0  
  6. else  
  7.     sleep 10  
  8. fi  



三、总结

(1)此处只列出单实例运行的两种简单方法,还有其他更好的方法会继续补充。

(2)若有更好的思路也可评论,一起分享。











本文转自:

http://blog.csdn.net/taiyang1987912/article/details/41016987


展开阅读全文

没有更多推荐了,返回首页