私は、すべて同じファイルに書き込む複数のバックグラウンドスクリプトを起動するbashスクリプトを書いています。私のスクリプトは次のようになります。
for (( COUNTER=0; ...)); do
./otherscript a b &
done
wait
および./otherscriptは次のようになります。
echo $1 $2 >> file.txt
これは安全ですか?これらのスクリプトはバックグラウンドで実行される可能性があり、DebianおよびUbuntuシステムで実行されます。
O_APPEND
モードのPOSIX準拠のファイルシステム(ext4、XFSなど)では(これが>>
提供されます)、プロセスの数に関係なく、書き込みは常に最下位になります。さらに、これらの書き込みが1つのメモリページに収まる場合、それらが複数の個別に追加されたコンポーネントに分割されるリスクはありません。
したがって、これは安全ではありません。
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.
書き込みが1ページ(通常は4kb)より大きい場合、複数のシステムコールに分割される可能性があるという警告がありますが、短くして、それぞれに完全なレコードが含まれていることを確認してください。安全です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加