免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: icewolf_li
打印 上一主题 下一主题

如何保证shell脚本不被重复执行? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-01-15 01:50 |只看该作者

如何保证shell脚本不被重复执行?

你试试看,在solaris下至少会出现两个的。
第二个脚本启动可能就是3个了。

论坛徽章:
0
12 [报告]
发表于 2005-01-15 21:12 |只看该作者

如何保证shell脚本不被重复执行?

##判断有同名shell是否正在执行
PG=`basename $0`
PN=`ps -ef | grep "$PG"| grep -v "grep" | awk 'BEGIN {a=0;} {a++;} END{print(a)}'`

#如果没有重复实例,正常执行
if [ $PN -eq 1 ]
then
        echo startup now!
#如果已经有个实例在运行,退出本实例
else
        echo already startup!
        exit 1;
fi

参考改一下吧,上面几位说的不是ps有问题而是wc -l出来的数字不一定对

论坛徽章:
0
13 [报告]
发表于 2005-01-16 21:29 |只看该作者

如何保证shell脚本不被重复执行?

原帖由 "欧阳不修"] 1  发表:

then
        echo startup now!
#如果已经有个实例在运行,退出本实例
else
        echo already startup!
        exit 1;
fi

参考改一下吧,上面几位说的不是ps有问题而是wc -l出来的数字不一定?.........



请教一下,为什么wc -l出来的数字有问题?有时对有时不对?

论坛徽章:
0
14 [报告]
发表于 2005-01-17 10:40 |只看该作者

如何保证shell脚本不被重复执行?

这里果然是高手如云阿!多谢各位指点,不管是对的还是有问题的解决方案:)

论坛徽章:
0
15 [报告]
发表于 2005-01-17 11:03 |只看该作者

如何保证shell脚本不被重复执行?

不过我在linux下执行
PG=`basename $0`
PN=`ps -ef -o etime -o args | grep "$PG" | awk '((substr($1,1,1)>0)||(substr($1,length($1)-1)>0))' | wc -l`
echo $PN
得出的结果=3

PG=`basename $0`
PN=`ps -ef | grep "$PG"| grep -v "grep" | awk 'BEGIN {a=0;} {a++;} END{print(a)}'`
echo $PN
得出结果=2

怎么解释?
给我感觉似乎``里面在grep $PG的时候把$PG的内容又运行出来一个,反而这段脚本本身就导致脚本重复执行了。。。

论坛徽章:
0
16 [报告]
发表于 2005-01-17 23:57 |只看该作者

如何保证shell脚本不被重复执行?

The race condition can happen if a simple solution just rely on  ps output.

Please refer to  [ SHELL 综合水平测试 ][ OVERVIEW 篇 ]
http://bbs.chinaunix.net/forum/viewtopic.php?t=476260&show_type=new

20. 如何保证 shell 程序只有单一 instance 运行? (有难度, 绝非一个 ps 命令可以搞定)

论坛徽章:
0
17 [报告]
发表于 2005-01-18 09:31 |只看该作者

如何保证shell脚本不被重复执行?

看了帖子了。但是好像没有人给出答案???

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
18 [报告]
发表于 2005-01-18 10:23 |只看该作者

如何保证shell脚本不被重复执行?

要得到严谨可靠的方案,直觉需要用到信号锁。
目前还没想好,希望通晓操作系统进程调度的朋友给点思路。
锁在那呢?用什么作为锁?

论坛徽章:
0
19 [报告]
发表于 2005-01-18 11:34 |只看该作者

如何保证shell脚本不被重复执行?

如果楼主的“唯一”概念可以放松些倒是好处理一些
如果楼主可以接受“该脚本运行初期——未做相关实质处理前——若检测到有同名脚本在运行,则退出脚本”的想法,下面的代码或许有点用

  1. #! /bin/sh

  2. DNAME=`basename $0`

  3. result=`ps -ef|grep ${DNAME}|grep -v grep|wc|awk '{print $1}'`
  4. if [ "${result}" -ge 3 ]
  5. then
  6. echo "Shell is running!"
  7. exit 0
  8. fi

  9. #do want you want
  10. ……

复制代码

论坛徽章:
5
2015亚冠之阿尔艾因
日期:2015-08-10 02:23:34操作系统版块每日发帖之星
日期:2015-08-13 06:20:002015七夕节徽章
日期:2015-08-21 11:06:1715-16赛季CBA联赛之山西
日期:2016-04-13 02:36:59操作系统版块每日发帖之星
日期:2016-04-14 06:20:00
20 [报告]
发表于 2005-01-18 11:57 |只看该作者

如何保证shell脚本不被重复执行?

呵呵,用 pstree -c 来做大概会好一点。。。 不然的话,得自己分析进程的父子关系再来判断了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP