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成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值