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