하지만

하지만

MacOS 터미널의 명령 open이나 Window 터미널의 명령을 흉내낼 때는 start주석을 달아주세요.이 답변~/.xsession-errors예를 들어 ( bash) 에 stdout 및 stderr을 추가하는 것이 좋습니다 .

alias open='&>>~/.xsession-errors xdg-open'

내가 예상하는 문제는 경쟁 조건입니다. lsof ~/.xsession-errors이는 22개의 프로세스가 쓰기 위해 파일을 열어두었음을 보여줍니다.

두 프로세스가 동일한 오프셋에 쓰는 것을 방지하는 방법은 무엇입니까 ~/.xsession-errors?

답변1

파일이 추가 모드로 열리면 운영 체제는 모든 쓰기가 마지막에 발생하도록 보장합니다. 따라서 한 기록기의 데이터가 다른 기록기의 데이터를 덮어쓰지 않습니다.

>>이는 파일이 추가 모드(즉, 셸)에서 열린 경우에만 적용됩니다. 파일 작성자가 다음 명령을 사용하여 파일을 연 경우에는 이 보장이 적용되지 않으며 >다음 순서가 가능할 수 있습니다.

  • 프로세스 1 >out:: 현재 위치 0
  • 프로세스 2 >>out: 이제 위치 0에 있습니다.
  • 프로세스 1: 쓰기 hello, 이제 위치 6
  • 프로세스 2: write world, 이것은 위치 6에 기록되었으며, 프로세스 2는 이제 위치 12에 있습니다.
  • 프로세스 1: write oops프로세스 1의 파일 위치가 변경되지 않았기 때문에 위치 6에 기록됩니다.

Debian에서는(2001년경부터) 파일이 .xsession-errors`/etc/X11/Xsession에서 생성되고 추가 모드에서 열리므로 모든 것이 잘 작동합니다.

 exec >>"$ERRFILE" 2>&1

무엇에 로그인해야 할지 모르겠습니다 ~/.xsession-errors.

모든 사람이 추가 모드에서 파일을 열면 모든 출력이 나타납니다. 그러나 출력이 조각화될 수 있습니다. 실제로 일반 파일에 대한 충분히 작은 쓰기는 원자성입니다. 512B보다 작은 것은 어디에서나 충분히 작아야 하며 Linux는 그 이상을 보장한다고 생각합니다. 따라서 여러 동시 작성기가 있는 경우에도 작성자가 라인 버퍼링된 출력을 사용하고 라인이 너무 길지 않다고 가정하면 각 로그 라인은 완전한 것으로 나타나야 합니다.

1POSIX 는 파이프 이외의 것을 보장하지 않습니다.

답변2

사용>>POSIX 쉘은 파일이 열리도록 보장합니다.O_APPEND.

Open Group 기본 사양 7호상태:

파일 상태 플래그가 설정된 경우 O_APPEND각 쓰기 전에 파일 오프셋을 파일 끝으로 설정해야 하며, 파일 오프셋 변경과 쓰기 작업 사이에 중간 파일 수정 작업이 발생해서는 안 됩니다.

POSIX는 가능한 최소 바이트 수를 정의합니다.필수의한 장으로 쓰여진write(2)부르다(SSIZE_MAX= 32,767). 반환 값은 실제로 작성된 바이트 수입니다(원자성 보장).

하지만

모든 파일 시스템이 호환되는 것은 아닙니다.여러 프로세스에서 파일에 추가설명하다:

모든 파일 시스템이 POSIX와 호환되는 것은 아니라는 점에 유의하는 것이 중요합니다. 잘 알려진 두 가지 예로 NFS와 HDFS(Hadoop 분산 파일 시스템)가 있습니다. 이러한 네트워크 파일 시스템에서는 추가가 시뮬레이션되며 경쟁 조건이 적용됩니다.

다들 잘 노는 건 아니지

open 을 사용할 수 있더라도 O_APPEND파일에 쓰는 다른 프로세스는 그렇지 않을 수 있습니다. 특정 파일을 확인할 수 있습니다.

lsof +fg <file>

걱정스럽게 달려가다 lsof +fg ~/.xsession-errors보니아니요 AP(추가) 플래그는 내 목록(Arch 기반 Manjaro Linux)의 22개 프로세스가 파일을 안전하게 열 수 없음을 나타냅니다.

다른 셸에서 실행 하는 경우에만 cat >> ~/.xsession-errors최종 출력 줄에 다음 AP플래그가 포함됩니다.

cat       3099 ravi    1w   REG   W,AP,LG   0,48      963 1926479 .xsession-errors

이 질문을 업스트림에서 어디에 질문해야 하는지 아는 사람이 있으면 댓글을 남겨주세요.

거의

모든 프로세스가 다음 중 하나를 사용하여 로컬로 파일을 여는 경우:

  • open(2)그리고 깃발O_APPEND
  • fopen(3)그리고 "a"깃발
  • POSIXsh >>또는bash &>>

그러면 경쟁 조건을 통해 데이터를 덮어쓰면 안 됩니다.

감사해요@길스 답변나에게 올바른 방향을 알려주었습니다.

관련 정보