Chinaunix

标题: 请教高手:shell脚本如何防止启动多个副本[已有两种方案,但是不完美] [打印本页]

作者: splitflag    时间: 2006-10-09 20:27
标题: 请教高手:shell脚本如何防止启动多个副本[已有两种方案,但是不完美]
shell脚本用在crontab中,为了防止同时启动多次,想了两个办法,但是都有缺点,求更好的方法:
假设shell脚本为ShellTest.sh
1.
nProcCount=`ps -ef | grep ShellTest.sh | grep -v grep |wc -l`
if [ $nProcCount -gt 1 ]
then
        echo already startup!
        exit 1;
fi
第一种方案在不同的主机平台上面会有不同的结果,比如在AIX上面就没有问题,但是在HP上面crontab里面启动的shell脚本,nProcCount 的结果为2,另外在SUN下面,发现有时候为1,有时候为2,另外也会受到因素影响,比如他人在编辑ShellTest.sh等等,总之通过这种方法计算出来nProcCount然后做判断有很大的缺陷。

2.
#写lock文件,防止启动多个进程
LockFile=$WORK_HOME/ShellTest.lock
trap 'rm $LockFile 2>/dev/null;exit 0' 1 2  15

if [ -f $LockFile ]
then
    echo already startup!
    exit 1;
fi
touch $LockFile
........#需要执行的脚本........
rm $LockFile
第二种方案在正常运行的时候,都没有问题,脚本运行结束了,$LockFile能够删除。但是如果ShellTest.sh被kill -9了,或者主机断电重启等等,而脚本正在执行,脚本捕捉不到信号,不能把$LockFile文件给删除,这样就造成$LockFile永远存在,下一次脚本永远不能执行。


如何有一个比较好的方法来解决这个问题呢?
作者: woodie    时间: 2006-10-09 20:37
搜索下,这个问题以前曾有过比较深入的讨论。

[ 本帖最后由 woodie 于 2006-10-9 21:02 编辑 ]
作者: lovesaka    时间: 2006-10-09 20:40

  1. lock()
  2. {
  3. touch file
  4. }

  5. unlock()
  6. {
  7. rm -rf file
  8. }

  9. if [ -e file ]
  10. then
  11.     echo 进程己经运行
  12.     exit
  13. fi
  14. lock
  15. .............
  16. ............
  17. ............
  18. unlock
复制代码

文件锁这个比较简单
作者: lovesaka    时间: 2006-10-09 20:43
但是如果那个创建文件的进程退出时没有解锁那就比较麻烦
作者: splitflag    时间: 2006-10-09 20:50
lovesaka ,你说的方法就是我写的第二种方案啊,是有问题的啊
作者: splitflag    时间: 2006-10-09 20:51
woodie,能帮我找找么,我只找到了一个帖子:
请教高手:判断本脚本是否已经有实例在运行?
作者: lovesaka    时间: 2006-10-09 20:52
加个

  1. trap "my_exit" 1 2 3 9 15
  2. my_exit()
  3. {
  4. rm -rf file
  5. exit
  6. }
复制代码

增强一下
作者: splitflag    时间: 2006-10-09 20:53
标题: 回复 7楼 lovesaka 的帖子
kill -9 的时候,file还是不能删除的
作者: lovesaka    时间: 2006-10-09 20:56
嗯那是-9是不能忽略的
作者: splitflag    时间: 2006-10-09 20:57
原帖由 lovesaka 于 2006-10-9 20:56 发表
嗯那是-9是不能忽略的

所以这种方法还是不行啊
作者: woodie    时间: 2006-10-09 21:01
原帖由 splitflag 于 2006-10-9 20:51 发表
woodie,能帮我找找么,我只找到了一个帖子:
请教高手:判断本脚本是否已经有实例在运行?

请教怎么保证一个shell脚本同一时间只能有一个在运行!
作者: quandingke    时间: 2010-11-24 15:23
06年的贴子了 不知道兄弟解决了没 我最近也为此纠结 和你一样 试过这两种方案都不行 我们也需要多种平台
PS 出来的结果让人大跌眼镜
作者: nxlinux    时间: 2010-11-24 15:34
1.做一个关机脚本,将lock文件删除
2.做一个守护进程监视主进程
作者: jason680    时间: 2010-11-24 16:44
shell脚本用在crontab中,为了防止同时启动多次,想了两个办法,但是都有缺点,求更好的方法:
假设shell脚 ...
splitflag 发表于 2006-10-09 20:27



nProcCount=`ps -ef | grep ShellTest.sh | grep -v grep |wc -l`
改为
nProcCount=`ps -ef | grep ":[0-9][0-9] ShellTest.sh" |wc -l`
作者: wtuter    时间: 2010-11-24 16:59
回复 1# splitflag


    临时文件




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2