语法上更简单的羊群调用

时间:2019-07-09 15:07:39

标签: linux bash locking flock

我对羊群的使用是因为我们有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等?

1 个答案:

答案 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

完全公开:我自己也没有尝试过,也没有使用羊绒。我确实同意,您的方法比手册页提供的第三个用法成语更直观,更易读。您可以考虑在开始并行进程之前进行文件创建(但我确定由于您的特殊情况,已经考虑并删除了该文件)。