URLを取得してMarkdownファイルを出力し、ファイルの末尾にURLといくつかのメタデータを追加するシェルスクリプトを作成したいと思います。このスクリプトが同時に呼び出され、並行性が発生する可能性がありますecho $some_multiline_thing >> file
。
これによると質問これによりデータが破損する可能性がありますfile
。追加の書き込みがすべてアトミックになるように書き込みを同期させるにはどうすればよいですか? (追加の順序は重要ではありません。)
アップデート: 説得は解決策を見つけました
function sync-append() {
local file="$1"
local text="$2"
local lock_fd
{
exec {lock_fd}>>$file
flock -x "$lock_fd"
echo "$text" >> $file
} always {
exec {lock_fd}>&-
}
}
このソリューションは、呼び出されない可能性があるzshを使用しますalways
(例kill -9
:)。
答え1
ただし:
{
flock 1 &&
echo something
} >> "$file"
とにかくプロセスが消えるとロックも消えますので、心配する必要はありませんkill -s KILL
。
答え2
ロックにまったく気にする必要がない可能性があります。条件は
- あなたのシステムはそれほど古いLinuxではありません(<3.14)。
- 単一プロセスで作成されたデータ量は32K(またはむしろ
getconf SSIZE_MAX
:)を超えません。
バラよりhttps://serverfault.com/questions/599486/what-is-the-size-of-an-atomic-write-to-disk-on-my-system