问题:
在书写脚本时,保证任何时刻一个用户只能有一个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
这样问题即可解决!
阅读(1411) | 评论(0) | 转发(0) |