shell脚本互斥锁

脚本防止同时运行两个实例的互斥锁

以下是主要写法。

# 检查锁文件是否存在,如果存在表示系统中有其他实例在运行,则直接退出。
# 需要注意的是,锁文件需要避免重名,建议脚本名称.file
[ -f /tmp/lock.file ] && exit

# 开始执行任务前,创建锁文件,并把当前pid 写入锁文件
echo $$ > /tmp/lock.file
sleep 1
# 判断锁文件中的pid 和当前pid 是否相同 ,如果不同则退出
[ "x$(cat /tmp/lock.file)" == "x"$$ ] || exit
# 执行任务,这里添加你的脚本逻辑
sleep 60
# 删除锁文件
rm -f /tmp/lock.file


更新一下:

以前的写法其实有点问题,万一脚本运行的时候机器关闭了,或者脚本运行提前退出,就执行不到删除锁文件了。

下面的逻辑会更加严谨,即先检查pid文件在不在,如果在,检查当前是否有同名脚本,并且是以pid文件中的的pid运行,如果有就退出,如果没有,就是自身了。再写pid到本地。

#单实例逻辑

if [ -f /var/run/${BASH_SOURCE[0]}.pid ];then
	ps -ef|grep -v grep|grep ${BASH_SOURCE[0]}|grep `cat /var/run/${BASH_SOURCE[0]}.pid` >> /dev/null
	if [ $? -eq 0 ];then
		exit 1
	fi
fi
echo $$ > /var/run/${BASH_SOURCE[0]}.pid

注:${BASH_SOURCE[0]}是获取当前脚本名


欢迎留言讨论更好的单实例逻辑。



猜你喜欢

转载自blog.csdn.net/hanjiezz/article/details/79571703