シェルスクリプトで追加の書き込みを同期する方法は? [コピー]

シェルスクリプトで追加の書き込みを同期する方法は? [コピー]

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

ロックにまったく気にする必要がない可能性があります。条件は

  1. あなたのシステムはそれほど古いLinuxではありません(<3.14)。
  2. 単一プロセスで作成されたデータ量は32K(またはむしろgetconf SSIZE_MAX:)を超えません。

バラよりhttps://serverfault.com/questions/599486/what-is-the-size-of-an-atomic-write-to-disk-on-my-system

関連情報