Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2768657
  • 博文数量: 587
  • 博客积分: 6356
  • 博客等级: 准将
  • 技术积分: 6410
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-23 10:54
个人简介

器量大者,福泽必厚

文章分类

全部博文(587)

文章存档

2019年(3)

2018年(1)

2017年(29)

2016年(39)

2015年(66)

2014年(117)

2013年(136)

2012年(58)

2011年(34)

2010年(50)

2009年(38)

2008年(16)

分类: LINUX

2010-05-18 14:09:06

问题:
在书写脚本时,保证任何时刻一个用户只能有一个make_wars.sh进程在运行,如果make_wars.sh进程在运行,则第二个运行的make_wars.sh 会被终止,并提示Another person is running ,please wait

脚本内容如下:
#only one user can run the script at the same time
/bin/ps -ef | grep $USER | grep make_wars.sh | grep -v grep|wc -l >${pwd}/num
num=`cat ~/project/num` ##pwd为我脚本中定义的一个变量(num文件所在的目录)
if [ "$num" !=  "1" ];  then
echo "Another person is running ,please wait"
rm -f ${pwd}/num
exit 0
fi
当然我也可以使用lock文件的方式(即在脚本运行时touch 一个文件,脚本运行完后删除创建的文件),但这样有一个问题,如果人为的终止该脚本的运行, 则需要我手动去删除那个touch的文件, 这样太麻烦了!

上段脚本大部分时间是可以的, 但偶尔也会不行(它奇怪的地方在于有时行有时不可以),例如:
./make_wars.sh  会提示Another person is running ,please wait
实际上此时根本没有用户在运行make_wars.sh(我可以用ps -ef | grep $USER|grep -v grep|wc -l 来查看。
原因:
解决方法:
将/bin/ps -ef | grep $USER | grep make_wars.sh | grep -v grep|wc -l >${pwd}/num
修改为:
allprocess=$(/bin/ps -ef )
echo "$allprocess" | grep $USER|grep make_wars.sh | grep -v grep |wc  -l >${pwd}/num
学习中好多的细节还是值得我们深思的!
 
 
 
其实上面的脚本还是不够严谨!(当然我以xliu或其他的用户来运行都是没问题的),但是如果我用
su - xliu -c '/home/xliu/project/make_wars.sh dot' 就会有问题!
 
例如:
我想用root用户更新xliu用户下的dot 包
#!/bin/sh
su - xliu -c '/home/xliu/project/make_wars.sh dot'
 
就会发现脚本不会执行,而会输出Another person is running,please wait
原因:
运行的时候会有两个进程:而且进程中都包含xliu,故读取的进程数为2, 所以就会输出Another person is running,please wait,其实我的原本思想是读取xliu用户的进程,而非包含xliu字符的进程,上面的书写不严密!
解决这个问题的方法:
allprocess=$(/bin/ps -ef )
echo "$allprocess" | grep ^$USER|grep make_wars.sh | grep -v grep |wc  -l>${pwd}/num
 
这样问题即可解决!
阅读(1375) | 评论(0) | 转发(0) |
0

上一篇:ssh登录时速度慢

下一篇:amanda集中备份

给主人留下些什么吧!~~