面试题答案
一键面试实现思路
- 使用文件锁:在Bash脚本中,可以利用
flock
命令来实现文件锁定。flock
通过对一个锁文件进行操作来实现对相关资源(这里是多个文件)的锁定。当一个脚本获取到锁时,其他脚本尝试获取同一把锁会被阻塞,直到锁被释放。 - 同步机制:将需要操作的多个文件相关操作放在获取锁之后,释放锁之前,这样就能确保在这些文件操作完成前,其他脚本无法访问这些文件,从而保证数据一致性。
核心代码片段
# 锁文件路径
LOCK_FILE="/tmp/your_lock_file.lock"
# 获取锁
if flock -x -w 10 $LOCK_FILE; then
# 这里开始进行对多个相关文件的操作
echo "已获取锁,开始操作文件"
# 示例文件操作,比如复制文件
cp file1.txt file1_backup.txt
cp file2.txt file2_backup.txt
# 操作完成,释放锁
flock -u $LOCK_FILE
echo "文件操作完成,释放锁"
else
echo "获取锁失败,等待超时"
fi
处理锁定失败的情况
- 等待重试:在上述代码中,
flock -w 10
表示等待10秒获取锁,如果10秒内未获取到锁,flock
命令会返回失败。可以通过循环机制来多次尝试获取锁,例如:
LOCK_FILE="/tmp/your_lock_file.lock"
retry_count=0
max_retries=5
while true; do
if flock -x -w 5 $LOCK_FILE; then
echo "已获取锁,开始操作文件"
# 文件操作
flock -u $LOCK_FILE
echo "文件操作完成,释放锁"
break
else
retry_count=$((retry_count + 1))
if [ $retry_count -ge $max_retries ]; then
echo "多次重试获取锁失败,退出"
break
else
echo "获取锁失败,等待5秒后重试,重试次数: $retry_count"
sleep 5
fi
fi
done
- 记录日志并退出:在获取锁失败时,记录详细的日志信息,包括当前时间、失败原因等,并根据业务需求决定是否退出脚本。例如:
LOCK_FILE="/tmp/your_lock_file.lock"
if flock -x -w 10 $LOCK_FILE; then
echo "已获取锁,开始操作文件"
# 文件操作
flock -u $LOCK_FILE
echo "文件操作完成,释放锁"
else
echo "$(date): 获取锁失败,等待超时" >> /var/log/your_script.log
exit 1
fi
这样通过记录日志,可以方便后续排查问题,而退出脚本则可以避免因未获取到锁而导致的数据不一致问题。