shell实现单例模式

使用场景:几个shell脚本共享一个本地derby库,需要保证同一时间只有单一shell脚本占有数据库。

方法一:查看进程是否存在

#!/bin/bash  
ScriptName=`basename $0`  
#basename,返回一个字符串参数的基本文件名称  
#pidof -x,找出shell脚本script的进程PID,全部列出进程PID  
if [ `pidof -x $ScriptName | wc -w` -gt 2 ]; then  
  echo "Instance is running!"  
  exit 0  
else  
  sleep 10      #执行程序   
fi

 验证当前线程中是否存在basename相同的进程

优点:shell退出后,可以快速检测到;没有文件的生成。

缺点:只适应单一shell脚本,如果多个脚本之间互斥,则不启作用。

方法二:flock锁文件

flock 是对于整个文件的建议性锁。也就是说,如果一个进程在一个文件(inode)上放了锁,那么其它进程是可以知道的。(建议性锁不强求进程遵守。)最棒的一点是,它的第一个参数是文件描述符,在此文件描述符关闭时,锁会自动释放。而当进程终止时,所有的文件描述符均会被关闭。于是,很多时候就不用考虑解锁的事情啦。

lockit () {
  exec 7<>.lock
#尝试锁文件
  flock -n 7 || {
#获得锁失败
    echo "Waiting for lock to release..."
#永久等待获得锁
    flock 7
  }
#获得锁成功
}

 优点:解决了多个shell脚本共享资源

 缺点:当获得锁的线程退出(包含kill)需要等待一段时间后,才能flock成功。

相关推荐