Seb*_*ebi 16 linux command-line semaphore bash
通过庆典会后文件,这个问题,这一个它仍然不是很清楚,我哪能执行原子写入(追加)操作在bash文件。我有一个在多个实例中运行的脚本,并且在某些时候必须将数据写入文件:
echo "$RESULT" >> `pwd`/$TEMP_DIR/$OUT_FILE
Run Code Online (Sandbox Code Playgroud)
如何使所有并发运行的脚本的所有写入操作都原子化(以便来自一个实例的数据不会与来自另一个实例的数据重叠)?
小智 13
似乎您需要使用flockman ( http://linux.die.net/man/1/flock )中的示例
(
flock -x 200
# Put here your commands that must do some writes atomically
) 200>/var/lock/mylockfile
Run Code Online (Sandbox Code Playgroud)
并将所有必须是原子的命令放在 () 中。
flock是联锁操作的方式之一。该实用程序是 util-linux 工具集的一部分,仅适用于 Linux。在更广泛的平台上可用的其他实用程序基于 Daniel J. Bernstein 的setlockdaemontools 包中的实用程序:
setlock 来自守护进程setlock 来自 Bruce Guenter 的 daemontools-encores6-setlock 来自 Laurent Bercot 的 s6chpst 来自 Gerrit Pape 的 runitrunlock 从韦恩马歇尔的 perpsetlock 从我的 nosh 工具集这些工具的操作范式与 M. Kurenkov 的答案中使用的范式略有不同(也flock可以使用,但不在该答案中使用)。调用setlock程序将加载链接到必须互锁的命令。 setlock本身打开并锁定锁定文件,并在其进程中为它留下一个文件描述符。只要该进程存在,锁就会持续存在(除非通过查找和关闭打开的文件描述符链接到显式释放锁的后续命令)。
对于问题中的情况,必须联锁产生输出行的命令,注意这会调用外部 命令echo而不是 shell 内置echo命令:
setlock mylockfile echo "$RESULT" >> ./$TEMP_DIR/$OUT_FILE
在这种情况下,不必在附加模式下互锁打开输出文件。如果是这样,则必须在锁中打开该文件,这需要使用fdredir/redirfd:
setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" echo "$RESULT"如果需要,哪个可以变成 shell 函数:
outfile() { setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" "$@" ; }
[…]
echo "$RESULT"或者坚持使用 shell 语法并让它由在互锁下运行的第二个 shell 解释,如果一个人的 shell 变量没有作为环境变量导出,则需要一些重要的引用:setlock mylockfile sh -c 'echo '"$RESULT"' >> "./'$TEMP_DIR'/'$OUT_FILE'"'
这当然适用于写入输出文件以外的事情:
setlock mylockfile sh -c '…互锁;东西 …'
| 归档时间: |
|
| 查看次数: |
8336 次 |
| 最近记录: |