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