명령이 있으면
$ ./script >> file.log
첫 번째 호출이 끝나기 전에 두 번째 호출이 발생하면 두 번 호출됩니다. 어떻게됩니까?
첫 번째 호출은 출력 파일에 대한 독점 잠금을 얻습니까? 그렇다면 쓰기를 시도 할 때 두 번째 스크립트가 실패하거나 쉘이 출력을 승인하고 (스크립트가 종료되도록 허용) 오류가 발생합니까?
아니면 로그 파일이 두 번 기록됩니까?
명령이 있으면
$ ./script >> file.log
첫 번째 호출이 끝나기 전에 두 번째 호출이 발생하면 두 번 호출됩니다. 어떻게됩니까?
첫 번째 호출은 출력 파일에 대한 독점 잠금을 얻습니까? 그렇다면 쓰기를 시도 할 때 두 번째 스크립트가 실패하거나 쉘이 출력을 승인하고 (스크립트가 종료되도록 허용) 오류가 발생합니까?
아니면 로그 파일이 두 번 기록됩니까?
답변:
유닉스 시스템은 대부분 필수 잠금을 피합니다. 커널이 사용자 프로그램에 의한 수정에 대해 파일을 잠그는 경우가 있지만 단지 다른 프로그램에 의해 쓰여지는 경우는 아닙니다. 프로그램이 파일을 쓰고 있기 때문에 유닉스 시스템은 파일을 잠그지 않습니다.
스크립트의 동시 인스턴스가 서로의 발가락을 밟지 않게하려면과 같은 잠금 메커니즘을 사용해야합니다 .flock
lockfile
추가 할 파일을 열면 >>
각 프로그램이 항상 파일 끝에 쓰도록 보장됩니다. 따라서 여러 인스턴스의 출력은 서로를 덮어 쓰지 않으며, 차례대로 쓰면 출력과 동일한 순서로 출력됩니다.
일어날 수있는 나쁜 일은 인스턴스 중 하나가 여러 덩어리의 출력을 작성하고 함께 나올 것으로 기대하는 경우입니다. 한 인스턴스의 연속적인 쓰기 사이에서 다른 인스턴스는 자체 쓰기를 수행 할 수 있습니다. 예를 들어, 인스턴스 1이 쓰고 foo
인스턴스 2가 쓰고 인스턴스 2 hello
만 쓴 bar
다면 파일에 포함 foohellobar
됩니다.
프로세스는 write
시스템 호출을 호출 할 때 파일에 효과적으로 기록합니다 . 에 대한 호출 write
은 원자 적입니다. 각 호출 write
은 다른 프로그램에 의해 중단되지 않는 일련의 바이트 를 씁니다. 단일 호출 write
이 효과적으로 쓸 데이터의 양에는 한계가 종종 있습니다 . 더 큰 크기의 경우 데이터의 시작 부분 만 작성되며 응용 프로그램은 write
다시 호출해야 합니다. 또한 많은 프로그램이 버퍼링을 수행합니다.: 그들은 메모리 영역에 데이터를 축적 한 다음이 데이터를 한 덩어리에 씁니다. 일부 프로그램은 완전한 라인 또는 다른 의미있는 분리 후에 출력 버퍼를 플러시합니다. 이러한 프로그램을 사용하면 전체 라인이 너무 길지 않은 한 (최대 몇 킬로바이트까지) 중단되지 않을 것으로 예상 할 수 있습니다 (OS에 따라 다름). 프로그램이 의미있는 지점에서 플러시되지 않고 버퍼 크기 만 기반으로하는 경우 한 인스턴스에서 4kB, 다른 인스턴스에서 4kB, 첫 번째 인스턴스에서 다시 4kB와 같은 것을 볼 수 있습니다.