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