BASH:让多个 bash 后台进程写入同一个文件是否安全?

标签 bash

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

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

    ./otherscript a b &

done
wait

和 ./otherscript 看起来像这样:

echo $1 $2 >> file.txt

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

最佳答案

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),它们可能会被分成多个系统调用——但要保持简短,并确保每个系统调用都包含完整记录,这样您就安全了。

关于BASH:让多个 bash 后台进程写入同一个文件是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59848172/

相关文章:

bash - BASH 中 && 和 -a 的区别

bash - 如何利用 Bash 的 awsome dirs 内置命令来利用笨拙的 pushd 和 popd

bash - 我可以列出所有正在运行的 docker-compose 文件吗?

bash - 通过堡垒服务器在私有(private) IP 上使用 boto SSH 到 EC2 实例

python - 如何精确返回 bash 脚本的输出值有命令

bash - 在 Bash 中用数字对字符串进行排序

linux - 管道sed不使用ngrep输出到文件

bash - ack-grep 安装脚本中不熟悉的 shell 语法

linux - 如何使用 bash 脚本按两个字段分组?

perl - stdin 上的 socat 阻塞