여러 프로세스 사용> 동일한 파일로 리디렉션

여러 프로세스 사용> 동일한 파일로 리디렉션

이것은 "덮어쓰지 않고 추가하는 방법"에 대한 질문이 아닙니다. 두 명령의 출력을 결합한 파일을 찾고 있는 것이 아닙니다. 이것은 제가 저지른 실수일 뿐이며 시스템이 왜 이런 일을 하는지 알고 싶습니다.

완료하는 데 오랜 시간이 걸리고 데이터(몇 초마다 한 줄씩)를 stdout으로 출력하는 명령(원격 ssh 명령줄에서)을 사용하고 있으므로 이를 파일로 리디렉션합니다.

command > file.out &

때로는 원격 세션의 연결이 끊어지지만 명령은 백그라운드에서 계속 실행됩니다. 저는 이걸 몰라서 같은 명령어를 다시 실행했는데,첫 번째 일이 끝나기도 전에:

command > file.out &

두 프로세스가 모두 완료되면 (이 사이트의 답변 중 일부를 읽은 후) 두 명령에 대한 줄이 엉망인 파일을 갖고 싶지만 출력 파일에는 두 실행 중 하나의 출력만 포함됩니다.

이 파일의 두 출력이 서로 얽혀 있지 않은 이유는 무엇입니까(주석에서 경고한 대로)여기)? 최종 파일은 2개의 출력 중 어느 것에 속합니까?

편집하다:

설명된 대로 질문 중 하나(출력 파일이 쓰기 위해 잠겨 있지 않은 이유는 무엇입니까?)를 제거했습니다.여기

답변1

리디렉션을 사용하여 쓰기 위해 파일을 열면 >파일은 다음과 같습니다.잘린즉, 완전히 지워졌습니다. 그러나 그것은아니요삭제하고 다시 만드세요.

한 명령이 먼저 파일을 자른 다음 파일에 무언가를 쓰고 다른 명령이 동일한 작업을 수행하는 경우 파일에서 첫 번째 명령의 위치는 변경되지 않습니다. 이는 두 개의 별도 위치에 동일한 파일에 쓰는 두 개의 명령이 있고 하나가 다른 명령의 출력을 덮어쓸 수 있음을 의미합니다.쓰기 순서와 쓴 데이터 양에 따라 다름.

따라서 파일의 데이터는 두 프로그램의 출력이 서로 얽혀 뒤섞여 있을 가능성이 높지만 이는 파일이 작성된 순서, 작성된 데이터의 양 및 잘린 시기에 따라 달라집니다. 문서.

다음은 두 명령의 데이터를 인터리빙하는 예입니다.

#!/bin/sh

( { echo hello; sleep 2; echo world; } | cat >file ) &
sleep 1
echo 123 >file &

wait

이 스크립트에서는 다음과 같은 일이 발생합니다.

  1. 첫 번째 명령은 쓰기 위해 파일을 열고 이를 자릅니다. 그것에 쓸 것입니다 hello\n.
  2. 잠시 후 두 번째 명령은 파일을 자르고 123\n. 이 시점에서 첫 번째 명령의 파일 포인터는 여전히 파일의 오프셋을 가리킵니다.
  3. 첫 번째 명령은 계속해서 world\n파일에 씁니다.

결과는 중간에 null 문자가 있는 파일입니다.

$ hexdump -C file
00000000  31 32 33 0a 00 00 77 6f  72 6c 64 0a              |123...world.|
0000000c

nul( 00위 출력에서)은 첫 번째 명령의 파일 포인터가 두 번째 명령의 파일 잘림으로 재설정되지 않아 "구멍"이 생성된다는 사실에서 비롯됩니다. 두 번째 명령은 쓰기만 123\n하지만 더 많은 데이터가 기록되면 nul을 덮어씁니다.

$ hexdump -C file
00000000  31 32 33 34 35 36 77 6f  72 6c 64 0a              |123456world.|
0000000c

여기서는 두 번째 명령을 만들었지 echo 12345678901234567이것이 파일에 남아 있는 전부입니다. 이는 world\n두 번째 명령이 쓰기를 마친 후 첫 번째 명령이 파일 포인터가 있는 곳에 계속 쓰기 때문입니다 .

관련 정보