在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
例如,要求脚本只能顺序访问某个资源,例如磁盘文件等,就可以参考下面的实现。 复制代码 代码如下: #!/bin/bash # # file locking using bash. # ver 0.1.6 # # author : malundao ( [email protected] ) # 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 替换为你要监控的脚本名字 还有一种方法是 死循环 可以根据不同的环境,不同的脚本内容,使用的方法也同步,方法很简单日后在写出来 |
请发表评论