Linux下flock工具使用求助:执行脚本遇文件描述符错误
解决flock脚本的"bad file descriptor"错误
你的问题出在**flock 无法对不存在的文件加排他锁**——默认情况下,flock 不会自动创建你指定的锁文件,当你尝试对一个不存在的文件使用 -x(排他锁)参数时,就会触发"bad file descriptor"错误。
下面是两种可行的修复方案:
方案1:先创建锁文件再使用flock
在创建临时目录后,先手动创建锁文件,再执行加锁逻辑:
#!/usr/bin/env bash temp_dir="$HOME/temperton/tmp" mkdir -p "$temp_dir" # 先创建锁文件 touch "$temp_dir/a" ( flock -x "$temp_dir/a" echo '111' ) & ( flock -x "$temp_dir/a" echo '222' ) &
方案2:使用文件描述符加锁(更推荐)
这种方式不需要提前创建文件,通过exec打开文件描述符时会自动创建文件,同时避免一些路径相关的问题:
#!/usr/bin/env bash temp_dir="$HOME/temperton/tmp" mkdir -p "$temp_dir" lock_file="$temp_dir/a" ( exec 9>"$lock_file" flock -x 9 echo '111' exec 9>&- # 关闭文件描述符 ) & ( exec 9>"$lock_file" flock -x 9 echo '222' exec 9>&- ) &
这里的逻辑是:
exec 9>"$lock_file"打开文件描述符9指向锁文件(不存在则自动创建)flock -x 9对文件描述符9对应的文件加排他锁exec 9>&-执行完后关闭文件描述符,释放资源
两种方案都能解决你的错误,方案2在脚本复杂场景下更可靠,因为它直接操作文件描述符,不会因为路径变化等问题出现意外。
内容的提问来源于stack exchange,提问作者user5047085
相关产品推荐
相关产品推荐

