首页 > 解决方案 > BASH:让多个 bash 后台进程写入同一个文件是否安全?

问题描述

我正在编写一个 bash 脚本,它启动多个后台脚本,这些脚本都写入同一个文件。我的脚本如下所示:

for (( COUNTER=0; ...)); do

    ./otherscript a b &

done
wait

和 ./otherscript 看起来像这样:

echo $1 $2 >> file.txt

这样做安全吗?可能有 100 多个这样的脚本在后台运行,这些脚本将在 Debian 和 Ubuntu 系统上运行。

标签: bash

解决方案


O_APPEND模式(这就是>>给你的)下符合 POSIX 的文件系统(ext4、XFS 等)上,无论你有多少进程,写入总是会走到底部;此外,如果这些写入适合单个内存页面,则它们不会被拆分为多个单独附加的组件。

所以,这是不安全的:

exec >>somefile   # redirects all future stdout to somefile in O_APPEND mode
printf %s 'Hello' # BUGGY: Writing less than a line, so you can get split at this point
echo ' World'

......这是这样的:

exec >somefile     # truncate file and make all future writes go to it, NOT in O_APPEND mode
echo "Hello World" # BUGGY: Not opened with O_APPEND, so our file pointer may not be
                   # ...at the end after other programs have been doing concurrent writes.

...但这安全的:

exec >>somefile     # redirects all future stdout to somefile in O_APPEND mode
echo "Hello World"  # SAFE: Writing a complete line, less than 4kb, in O_APPEND mode.

需要注意的是,如果您的写入大于一页(通常为 4kb),它们可能会被拆分为多个系统调用——但请保持它们的简短,并确保每个都包含完整的记录,这样您就安全了。


推荐阅读