需求: 并发写入时实现劝告锁。
1. 锁判断抽离为一个外部脚本,类似于库文件,在业务中调用这个脚本即可
2. 如何调用外部脚本?
3. 捕获退出信号来释放锁
锁申请和释放的外部脚本
#!/bin/bash # 抽离文件锁申请方法 # 2022年1月3日11:24:18 function lockfile(){ trap "echo trapped;rm -rf "${lock_file}";exit 1" EXIT # 无论脚本以何种方式退出,只要不是kill -9,都会触 发这个信号。 lock_file=$1 #接受外部脚本调用参数 while [ -f "${lock_file}" ];do # 判断锁是否存在 echo "locked..." sleep 1 done touch "${lock_file}" # 如果不存在则创建 }
文件锁实现
lock1.sh
#!/bin/bash # 文件实现锁功能 # 调用外部脚本判断是否申请锁成功 # 2022年1月3日11:29:49 # -f 从外部加载脚本, source加载脚本,加载之后lockfile在当前shell执行 # || 前面的条件中有一个为false执行后面的内容即不存在并退出。 # [ -f "lockfile.sh" ] && source lockfile.sh || { echo "lockfile.sh not exists";exit 1; } lock_file=/var/lock/mylock lockfile ${lock_file} timeout 5 bash -c ' # 5s钟的timeout。 5s不释放锁自动释放。 while true;do echo "lock1.sh : `date +'%T'`" >> /tmp/a.log sleep 1 done'
lock2.sh
#!/bin/bash # 文件实现锁功能 # 调用外部脚本判断是否申请锁成功 # 2022年1月3日11:29:49 # -f 从外部加载脚本, source加载脚本,加载之后lockfile在当前shell执行 # || 如果不存在则退出。 [ -f "lockfile.sh" ] && source lockfile.sh || { echo "lockfile.sh not exists";exit 1; } lock_file=/var/lock/mylock lockfile ${lock_file} timeout 5 bash -c ' while true;do echo "lock2.sh : `date +'%T'`" >> /tmp/a.log sleep 1 done'
结果