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),它们可能会被拆分为多个系统调用——但请保持它们的简短,并确保每个都包含完整的记录,这样您就安全了。
推荐阅读
- java - 使用2个api请求并在一个recyclerview中显示数据
- docker - Heroku 上的 Bitnami-docker-keycloak:Web 进程无法绑定到 $PORT(错误 R10)
- python - 如何在同步代码的龙卷风中使用 Process Pool Executor?
- python-3.x - 通过基于条件生成可能的组合将数据帧拆分为多个数据帧
- python - Kivy 使用 RecycleView 的 CheckBox 问题
- c# - 来自主模型的 C# 子模型
- c++ - 在 .cpp 文件中定义整数常量的正确方法
- ios - CreateML 迁移学习模型不会在 iOS 模拟器上运行
- java - 使用 @ManyToMany 复制实体
- pandas - Pandas 创建一个新的 C 列,其值为 A 列但没有连字符