MST
星途 面试题库

面试题:Bash中文件锁定基础

在Bash脚本里,如何使用flock命令对文件进行简单的写锁定,以防止多个脚本同时写入同一个文件?请写出具体的代码示例,并解释每一行代码的作用。
33.1万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

以下是实现使用flock命令对文件进行简单写锁定以防止多个脚本同时写入同一个文件的Bash脚本示例:

#!/bin/bash

# 要锁定的文件
LOCK_FILE="/tmp/mylockfile"

# 使用flock命令对文件进行写锁定,200是此锁定操作在脚本中的文件描述符
exec 200>$LOCK_FILE
if flock -x -w 10 200; then
    # 成功获取锁后执行的操作,这里以写入文件为例
    echo "`date +%Y%m%d%H%M%S` Script is writing to the file." >> /tmp/shared_file
    # 模拟一些写入操作的延迟
    sleep 5
    # 释放锁
    flock -u 200
else
    # 获取锁失败,打印提示信息
    echo "Could not acquire lock. Another script is writing to the file."
fi
# 关闭文件描述符
exec 200>&-

各代码行解释:

  1. #!/bin/bash:指定脚本使用Bash解释器来执行。
  2. LOCK_FILE="/tmp/mylockfile":定义一个变量LOCK_FILE,指定锁定文件的路径为/tmp/mylockfile。此文件用于进程间通信以实现锁定机制。
  3. exec 200>$LOCK_FILE:将文件描述符200关联到LOCK_FILE,之后flock命令将基于此文件描述符进行操作。
  4. if flock -x -w 10 200; then:使用flock命令尝试获取排他锁(-x),等待10秒(-w 10)来获取锁,基于文件描述符200进行操作。如果成功获取锁,进入if代码块。
  5. echo "date +%Y%m%d%H%M%S Script is writing to the file." >> /tmp/shared_file:获取锁后,向/tmp/shared_file文件写入带有时间戳的信息,表示脚本正在写入文件。
  6. sleep 5:模拟一些写入操作的延迟。
  7. flock -u 200:释放之前获取的锁,基于文件描述符200进行操作。
  8. else:如果获取锁失败,进入此代码块。
  9. echo "Could not acquire lock. Another script is writing to the file.":获取锁失败时打印提示信息。
  10. exec 200>&-:关闭文件描述符200,解除其与LOCK_FILE的关联。