출력을 파일로 리디렉션하면 파일에 잠금이 적용됩니까?


30

명령이 있으면

$ ./script >> file.log

첫 번째 호출이 끝나기 전에 두 번째 호출이 발생하면 두 번 호출됩니다. 어떻게됩니까?

첫 번째 호출은 출력 파일에 대한 독점 잠금을 얻습니까? 그렇다면 쓰기를 시도 할 때 두 번째 스크립트가 실패하거나 쉘이 출력을 승인하고 (스크립트가 종료되도록 허용) 오류가 발생합니까?

아니면 로그 파일이 두 번 기록됩니까?


1
기본적으로 파일을 잠그는 시스템을 모르겠습니다. 두 프로그램이 모두 추가 모드에 있기 때문에 두 프로그램이 쓰기를 인터리브하게 될 가능성이 높습니다. 결과는 다소 예측할 수 없습니다. "hello world"대신 "hweolrllod"를 얻을 수 있습니다.
jw013

답변:


18

>>append를 사용하는을 사용하므로 각 인스턴스의 각 출력 줄은 발생한 순서대로 추가됩니다.

스크립트 출력 인쇄되면 1\n통해 5\n각각의 인스턴스가 둘 사이에 일초 지연이 2.5 초를 시작 나중에이를 얻을 수 있습니다 :

1
2
1
3
2
4
3
5
4
5

따라서 귀하의 질문에 대답하십시오 : 아니오.


23

유닉스 시스템은 대부분 필수 잠금을 피합니다. 커널이 사용자 프로그램에 의한 수정에 대해 파일을 잠그는 경우가 있지만 단지 다른 프로그램에 의해 쓰여지는 경우는 아닙니다. 프로그램이 파일을 쓰고 있기 때문에 유닉스 시스템은 파일을 잠그지 않습니다.

스크립트의 동시 인스턴스가 서로의 발가락을 밟지 않게하려면과 같은 잠금 메커니즘을 사용해야합니다 .flock lockfile

추가 할 파일을 열면 >>각 프로그램이 항상 파일 끝에 쓰도록 보장됩니다. 따라서 여러 인스턴스의 출력은 서로를 덮어 쓰지 않으며, 차례대로 쓰면 출력과 동일한 순서로 출력됩니다.

일어날 수있는 나쁜 일은 인스턴스 중 하나가 여러 덩어리의 출력을 작성하고 함께 나올 것으로 기대하는 경우입니다. 한 인스턴스의 연속적인 쓰기 사이에서 다른 인스턴스는 자체 쓰기를 수행 할 수 있습니다. 예를 들어, 인스턴스 1이 쓰고 foo인스턴스 2가 쓰고 인스턴스 2 hello만 쓴 bar다면 파일에 포함 foohellobar됩니다.

프로세스는 write시스템 호출을 호출 할 때 파일에 효과적으로 기록합니다 . 에 대한 호출 write은 원자 적입니다. 각 호출 write은 다른 프로그램에 의해 중단되지 않는 일련의 바이트 를 씁니다. 단일 호출 write이 효과적으로 쓸 데이터의 양에는 한계가 종종 있습니다 . 더 큰 크기의 경우 데이터의 시작 부분 만 작성되며 응용 프로그램은 write다시 호출해야 합니다. 또한 많은 프로그램이 버퍼링을 수행합니다.: 그들은 메모리 영역에 데이터를 축적 한 다음이 데이터를 한 덩어리에 씁니다. 일부 프로그램은 완전한 라인 또는 다른 의미있는 분리 후에 출력 버퍼를 플러시합니다. 이러한 프로그램을 사용하면 전체 라인이 너무 길지 않은 한 (최대 몇 킬로바이트까지) 중단되지 않을 것으로 예상 할 수 있습니다 (OS에 따라 다름). 프로그램이 의미있는 지점에서 플러시되지 않고 버퍼 크기 만 기반으로하는 경우 한 인스턴스에서 4kB, 다른 인스턴스에서 4kB, 첫 번째 인스턴스에서 다시 4kB와 같은 것을 볼 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.