shell单实例脚本中file descriptor与flock的工作原理咨询
关于flock与文件描述符100的逻辑说明
1. 100>/var/lock/dobackup.lock的作用
这是Bash的文件重定向语法,作用是:为当前括号()包裹的子shell进程,打开编号为100的文件描述符,并将该描述符绑定到/var/lock/dobackup.lock文件(写入模式,文件不存在则自动创建)。
子shell内执行的所有命令,都可以访问这个已经打开的文件描述符100,且直到整个子shell执行完毕退出前,该文件描述符会一直处于打开状态。
2. flock -n 100的作用
flock是基于已打开的文件描述符实现文件锁的工具,而非直接基于文件路径加锁:
- 这里的
100就是指定要给文件描述符100对应的锁文件,加排他锁 -n参数表示非阻塞模式:如果当前锁已经被其他进程持有,flock会直接返回非0的错误退出码,而非阻塞等待锁释放- 当flock加锁失败后,就会触发后面的
|| another_instance逻辑,执行退出操作
这种基于文件描述符加锁的方式最大的优势是:锁的生命周期和持有锁的进程绑定,进程无论正常退出还是异常崩溃,系统都会自动回收其打开的文件描述符,锁也会自动释放,不会出现手动管理锁文件时常见的“进程异常退出遗留脏锁文件,导致后续实例永远无法启动”的问题。
3. 编号100的特殊含义说明
100本身没有任何特殊含义。
Linux系统默认预留了0、1、2三个文件描述符分别对应标准输入、标准输出、标准错误,用户自定义的文件描述符只要选择大于2的未被占用的编号即可。这里选择100只是选了一个数值较大的编号,避免和脚本内其他可能用到的自定义文件描述符产生冲突,你替换为3、20、123等其他数值,逻辑完全不会受影响。
内容的提问来源于stack exchange,提问作者misterblack0101
相关产品推荐
相关产品推荐

