我对羊群的使用是因为我们有N个同时启动的进程,所有进程都需要对文件的读取权限。如果文件不存在,我们需要创建它,但是只有一个进程可以做到这一点,否则它们将相互覆盖。
使用Linux的flock
来完成此操作的普通示例如下:
(
flock -n 9 || exit 1
if [ ! -f file.txt ]; then
echo 'Simulate the file creation' > file.txt
fi
) 9>/var/lock/mylockfile
但是,这很容易阅读,特别是如果您不熟悉子shell和文件描述符的话。我想知道是否可以手动锁定和解锁文件:
flock --exclusive file.txt
if [ ! -f file.txt ]; then
echo 'Simulate the file creation' > file.txt
fi
flock --unlock file.txt
如果没有,是否有某种类似的方式来使用flock
,该方式尽可能可读,避免使用子shell,exec
等?
答案 0 :(得分:0)
我建议您遵循手册页中提供的惯用语,并向读者提供手册页的URL作为注释。从某种意义上说,我建议对您的代码进行此更改:
# flock usage: Please see https://stackoverflow.com/questions/56955601/syntactically-simpler-flock-invocation
# Or see flock third form usage here: http://man7.org/linux/man-pages/man1/flock.1.html
(
flock -n 9 || exit 1
if [ ! -f file.txt ]; then
echo 'Simulate the file creation' > file.txt
fi
) 9>/var/lock/mylockfile
也就是说,我认为您的逻辑很好,但是我会选择使用除您正在创建的文件以外的另一个锁定文件。
所以这是我尝试您的方法的方法:
flock --exclusive /var/log/mylockfile
if [ ! -f file.txt ]; then
echo 'Simulate the file creation' > file.txt
fi
flock --unlock /var/log/mylockfile
完全公开:我自己也没有尝试过,也没有使用羊绒。我确实同意,您的方法比手册页提供的第三个用法成语更直观,更易读。您可以考虑在开始并行进程之前进行文件创建(但我确定由于您的特殊情况,已经考虑并删除了该文件)。