免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4731 | 回复: 14
打印 上一主题 下一主题

请教高手:shell脚本如何防止启动多个副本[已有两种方案,但是不完美] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-09 20:27 |只看该作者 |倒序浏览
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永远存在,下一次脚本永远不能执行。


如何有一个比较好的方法来解决这个问题呢?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2006-10-09 20:37 |只看该作者
搜索下,这个问题以前曾有过比较深入的讨论。

[ 本帖最后由 woodie 于 2006-10-9 21:02 编辑 ]

论坛徽章:
0
3 [报告]
发表于 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
复制代码

文件锁这个比较简单

论坛徽章:
0
4 [报告]
发表于 2006-10-09 20:43 |只看该作者
但是如果那个创建文件的进程退出时没有解锁那就比较麻烦

论坛徽章:
0
5 [报告]
发表于 2006-10-09 20:50 |只看该作者
lovesaka ,你说的方法就是我写的第二种方案啊,是有问题的啊

论坛徽章:
0
6 [报告]
发表于 2006-10-09 20:51 |只看该作者
woodie,能帮我找找么,我只找到了一个帖子:
请教高手:判断本脚本是否已经有实例在运行?

论坛徽章:
0
7 [报告]
发表于 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. }
复制代码

增强一下

论坛徽章:
0
8 [报告]
发表于 2006-10-09 20:53 |只看该作者

回复 7楼 lovesaka 的帖子

kill -9 的时候,file还是不能删除的

论坛徽章:
0
9 [报告]
发表于 2006-10-09 20:56 |只看该作者
嗯那是-9是不能忽略的

论坛徽章:
0
10 [报告]
发表于 2006-10-09 20:57 |只看该作者
原帖由 lovesaka 于 2006-10-9 20:56 发表
嗯那是-9是不能忽略的

所以这种方法还是不行啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP