![쉘 스크립트에서 추가 쓰기를 동기화하는 방법은 무엇입니까? [복사]](https://linux55.com/image/173982/%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%EC%B6%94%EA%B0%80%20%EC%93%B0%EA%B8%B0%EB%A5%BC%20%EB%8F%99%EA%B8%B0%ED%99%94%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
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