免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1774 | 回复: 3

保证一个脚本不被重复执行之我见 [复制链接]

论坛徽章:
0
发表于 2006-04-13 13:58 |显示全部楼层
工作中有些脚本是放在crontab中定时执行的,最近有发现系统繁忙时脚本重复执行的问题,看了论坛上也有几个贴子在讨论这个,我因为刚好处理过这个东东,就写点使用经验.
防止重复执行有两种简单常用方法:
一是扫描进程,在进程列表中搜索是否有相同的进程名
PROC=$0
PROCA=${PROC##*/}
PROC_NAME=${PROCA%.*}
num=`ps -ef|grep -i ${PROC_NAME}|grep -v grep|grep -v vi|grep -v pg|grep -v more|wc -l`
if [ $num -gt 1] ; then  
echo "进程已存在";
exit 0;
fi
说明:ps -ef 列出除内核进程外的所有进程,(ps 其他参数对于本例子可能都有些缺点,-ef比较全面)
这些进程中还要除去一些非执行类的进程.

二是设定一个文件锁
if [ -f pid.log ]
then
echo "script runing" && exit 0
else
echo $$ > pid.log
fi
# ------- start of logic --

# ------- end of logic --
rm -f pid.log
这种方法缺点是脚本执行中有错误时跳出后,最后一步执行不到,下次进程就不会再自动起来了,除非手工删除.

上面两种方法,我个人觉得比较简单实用,适合一般情况.
请高手指正.

[ 本帖最后由 @龙井茶 于 2006-4-13 14:11 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2006-04-13 14:37 |显示全部楼层
学习....

论坛徽章:
0
发表于 2006-04-13 14:46 |显示全部楼层
头一回看见这么多grep连一起

论坛徽章:
0
发表于 2006-04-15 15:24 |显示全部楼层
脚本名$0,本次运行的pid0和pid记录文件中的pid1,搜索是否有同名$0,同pid1的进程在运行,若没有,将本次运行的pid0输出到记录文件(tmp或$HOME下根据需要确定),进入实质性的执行过程;若有,比较pid0,pid1是否相等,若相等,进入实质性的执行过程;其余情况均退出。为了提高可靠性,可以在脚本的第一个执行语句前等待一段时间。这样可以保证,在将脚本设置为开机后自动运行,意外停机后启动系统,这些情况下脚本能正常运行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP