쉘 스크립트에서 추가 쓰기를 동기화하는 방법은 무엇입니까? [복사]

쉘 스크립트에서 추가 쓰기를 동기화하는 방법은 무엇입니까? [복사]

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

관련 정보