web-dev-qa-db-ja.com

シェルスクリプトで書き込みの追加を同期するにはどうすればよいですか?

URLと出力マークダウンファイルを受け入れ、そのURLといくつかのメタデータをそのファイルの最後に追加するシェルスクリプトを作成したいと思います。このスクリプトが同時に呼び出され、結果としてecho $some_multiline_thing >> files。

これにより 質問 、これにより、破損したデータが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)。

2
HappyFace

ただやる:

{
  flock 1 &&
    echo something
} >> "$file"

いずれにしてもプロセスがなくなるとロックは失われるので、kill -s KILLについて心配する必要はありません。

2