防止shell脚本重复执行的代码
程序员文章站
2023-09-28 10:04:31
例如,要求脚本只能顺序访问某个资源,例如磁盘文件等,就可以参考下面的实现。
复制代码 代码如下:#!/bin/bash## file locking using bash...
例如,要求脚本只能顺序访问某个资源,例如磁盘文件等,就可以参考下面的实现。
复制代码 代码如下:
#!/bin/bash
#
# file locking using bash.
# ver 0.1.6
#
# author : malundao ( malundao@sina.com )
# date : 2011-08-31
# ref : http://unix.derkeiler.com/newsgroups/comp.unix.shell/2005-09/0472.html
#
# note:
# shflock_cleanhook() is a user defined function to clean up user-specific sth.
#
# /path/to/lock/. note; directory, not a file.
# should be modified
lockpath="/tmp"
cleanup() {
shflock_cleanhook
cd $lockpath
[ -e lock.pid ] || exit
read pid >/dev/null 2>&1 <lock.pid
if [ -n "$pid" ]; then
if [ "$pid" == "$$" ]; then
rm -f lock.$pid
rm -f lock.pid
exit
fi
fi
exit
}
# trap exit ?
trap 'cleanup' hup int term
getlock() {
oldpath=`pwd`
cd $lockpath
while
echo $$ > lock.$$
[ -e lock.pid ]
do
rm lock.$$
read pid >/dev/null 2>&1 <lock.pid
if [ -n "$pid" ]; then
if [ -e /proc/$pid ]; then
cd $oldpath
return 1 # lock is taken by others
else
#unsafe: rm -f lock.$pid
echo warn: please delete stale lock.pid by hand.
return 2
fi
else
# sleep some seconds,then back to 'while' loop
# 11 is a prime number, $$ as a random.
echo sleep $(( $$ % 11 ))
sleep $(( $$ % 11 ))
fi
done
# 'ln -s' is an atom op.
ln -s lock.$$ lock.pid >/dev/null 2>&1
if [ $? -eq 0 ]; then
cd $oldpath
return 0 # we got the lock
else
[ -e lock.pid ] || echo warn: please delete hanging lock.pid by hand.
cd $oldpath
return 3 # lock is probably taken by others.
fi
}
putlock () {
oldpath=`pwd`
cd $lockpath && rm -f lock.$$ lock.pid
cd $oldpath
}
## test
shflock_cleanhook() {
echo i\'m a hook.
}
while true; do
while ! getlock; do
#echo wait a second...
sleep 1
done
echo \[$$\] `date` ,now hold lock for 3 seconds...
sleep 3
#echo putlock
putlock
sleep 1 # yield
done
防止脚本多次执行(一)
复制代码 代码如下:
while [ `ps x |grep -v grep|grep filename.sh|wc -l` -gt 0 ];
do
exit
done
把内容放在脚本最上面
filename.sh 替换为你要监控的脚本名字
还有一种方法是 死循环 可以根据不同的环境,不同的脚本内容,使用的方法也同步,方法很简单日后在写出来
上一篇: rsync结合find技巧分享
下一篇: 联想G480拆机过程图解