shell案例解决之flock示例
shell案例故障:
在内部测试服务器上,有一个shell脚本用于将csv数据表格转换成Python数据文件。在执行过程中的某一步,由于需要对一些文件进行写操作,所以如果同时有两个人运行了导表程序,则第二个人运行到此步骤时,就会失败并退出,这既拖慢了第一个人的导表速度,而且对第二人的体验也不好(运行了五分钟然后告诉我失败了????这个事????what????)。所以我就想给这个shell脚本加个锁,保证同一时刻只能有一个实例在运行,并及早给出其他用户提示信息。
土办法
最开始想到的是一个土办法:每次shell开始运行,就检测某个特定的“锁文件”是否存在,如果不存在就touch一个;如果存在,则输出错误信息,提示用户稍后重试。
LOCKFILE=/home/xxq/lock_update_check_commit_sh.tmp
if [ -e $LOCKFILE ]
then
echo "Another user is doing the same thing, please wait!"
exit 1
else
touch $LOCKFILE
chmod 600 $LOCKFILE
fi
另外,在程序运行结束时,需要删除这个临时文件:
rm_lock( )
{
if [ -e $LOCKFILE ]
then
rm -f $LOCKFILE
fi
}
但是,程序可能正常结束,也可能在外部被kill掉,或者运行中出了异常而中止,所以除了正常结束之外,对于各种异常情况,何时调用这个rm_lock函数呢?
这里,我们用一个trap命令去回调,它可以为信号量设置回调命令。
trap 'rm_lock' 1 2 3 9 15
这样一个土“文件锁”就成型了。
从土到皇帝的新装+++(小地主变土豪)
flock提供了一种更清爽的办法来实现这一功能:
LOCKFILE="/home/xxq/lock_update_check_commit_sh.tmp"
exec 200>$LOCKFILE
flock -n 200 || {
echo "Another user is doing the same thing,please wait.."
flock 200
}
exec那一行将LOCKFILE和文件描述符200以“写”的方式连接起来(不需要LOCKFILE存在),之后flock尝试获得文件描述符200的锁,-n参数表示如果失败则直接fail而不等待。所以这里如果没有获得锁的话,会输出一条提示信息,然后以阻塞的方式等待获得文件描述符200的锁。
最给力的是,在整个shell脚本执行结束时,文件描述符200会关闭,则其上的锁也就会自动释放。这样,就不用上面那种使用trap的方式去处理各种异常!
本文转自: http://blog.guoyb.com/2017/09/16/flock/ 略有修改
技术是没有终点的,也是学不完的,最重要的是活着、不秃。 学习看书还是看视频,都不重要,重要的是学会,欢迎关注,我们的目标---不秃。
---更多运维开发交流及软件包免费获取请加V: Linuxlaowang
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义