Shell脚本进程锁机制解析
1. 命令行参数解析 (第9-21行)12345whilegetoptsm:o:r:arg;docase$argin# ... 参数处理逻辑代码中省略了具体内容esacdone使用getopts解析命令行参数支持三个带参数的选项-m、-o、-r具体处理逻辑在代码中被省略了2. 文件锁机制 (第23-34行)这是代码的核心部分123456LOCK_FILE/tmp/gen_emmc_img.lockechoWaiting for lock for model gen_emmc_img...exec200$LOCK_FILE# 将文件描述符200重定向到锁文件flock 200# 对文件描述符200加锁echoLock acquired for gen_emmc_img!锁机制的工作原理创建锁文件/tmp/gen_emmc_img.lock使用flock命令对文件描述符200加锁如果锁已被占用脚本会阻塞等待直到锁可用3. 清理和锁释放 (第30-34行)12345_cleanup_flock() {echoReleasing lock for gen_emmc_img!flock -u 200# 释放文件描述符200的锁}trap_cleanup_flock EXIT# 设置陷阱在脚本退出时自动调用清理函数设计目的这种设计主要用于防止并发冲突确保同一时间只有一个gen_emmc_img.sh进程在运行资源保护在生成 eMMC 镜像时避免多个进程同时操作导致的冲突自动清理使用trap确保即使脚本异常退出也能释放锁典型应用场景在嵌入式开发或系统镜像生成过程中这种锁机制很常见用于保护对存储设备的独占访问临时文件的创建和使用系统关键资源的访问这是一个很经典的 Shell 脚本并发控制实现好的我来深度解读第23-34行的文件锁机制。这部分代码确实比较巧妙让我详细分解逐行深度解析第23行定义锁文件路径1LOCK_FILE/tmp/gen_emmc_img.lock在系统的临时目录创建一个锁文件文件名包含脚本名称避免与其他脚本冲突第26行文件描述符重定向1exec200$LOCK_FILE这是关键的一步exec命令在当前shell进程中执行重定向200表示将文件描述符200重定向到锁文件如果文件不存在会自动创建存在则截断文件描述符200是一个任意选择的大于2的数字避免与stdin0, stdout1, stderr2冲突第27行获取文件锁1flock 200flock命令的工作原理对文件描述符200指向的文件加锁这是** advisory lock**建议性锁不是强制性锁如果锁已被其他进程持有当前进程会阻塞等待锁的释放发生在文件描述符关闭时第30-33行清理函数1234_cleanup_flock() {echoReleasing lock for gen_emmc_img!flock -u 200# 显式释放锁}第34行陷阱设置1trap_cleanup_flock EXITtrap的作用注册一个信号处理程序EXIT是一个伪信号在shell退出时触发无论脚本正常结束还是异常退出都会调用_cleanup_flock锁机制的工作原理示意图123456789进程A启动↓exec 200lockfile # 创建文件描述符↓flock 200 # 加锁成功继续执行↓[执行关键代码...]↓脚本结束 → trap触发 → flock -u 200 → 释放锁1234567进程B启动当A持有锁时↓exec 200lockfile # 创建文件描述符↓flock 200 # 阻塞等待...↓ # 当进程A释放锁后flock返回 → 获得锁继续执行为什么需要这样设计1.原子性操作123456# 如果没有flock你可能会这样写有竞态条件if[ ! -f$LOCK_FILE];thentouch$LOCK_FILE# 这里可能有多个进程同时通过检查# 执行任务...rm$LOCK_FILEfi2.自动清理保障即使脚本被CtrlC中断、发生错误退出trap EXIT也能确保锁被释放。3.避免僵尸锁传统方法可能因为进程崩溃而留下锁文件导致系统永久锁定。这里使用内核管理的文件锁进程退出后锁自动释放。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2479884.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!