欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

shell实现单例模式

程序员文章站 2022-04-15 19:30:58
...

使用场景:几个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成功。