표준 출력을 파일로 리디렉션하고 다른 작업과 동시에 동일한 파일에서 읽는 방법은 무엇입니까?

표준 출력을 파일로 리디렉션하고 다른 작업과 동시에 동일한 파일에서 읽는 방법은 무엇입니까?

Ubuntu Linux Bash에서 원격으로 작업을 실행하고(시간이 꽤 오래 걸림) 파일로 nohup리디렉션 하고 싶습니다 . 예를 들면 다음과 같습니다.stdout

nohup task > out.txt &

가끔 출력 파일을 보고 작업 진행 상황을 확인하고 싶을 때가 있습니다.

cat out.txt

Bash가 쓰기 위해 파일을 열 때마다 파일의 내용이 비어 있는 것처럼 보이기 때문에 저는 아직 이를 수행하는 방법을 찾지 못했습니다.

stdout그래서 내 질문은: "공유" 리디렉션을 허용하는 Linux 명령 이 있습니까 ?

답변1

Bash가 쓰기 위해 파일을 열 때마다 파일 내용은 비어 있는 것으로 나타납니다.

그러나 실제로는 그렇지 않습니다. 실제 상황은 이 작업이완충기출력 - 일정 시간 동안 메모리에 축적된 다음 청크로 파일에 기록됩니다. 메모리 버퍼의 크기는 수 킬로바이트로 고정되어 있습니다. 각 파일 쓰기에는 상대적으로 높은 오버헤드가 있으므로 이는 성능을 위해 수행됩니다. 따라서 처음에는 프로그램의 출력을 볼 수 없지만 조금씩 출력되는 것을 볼 수 있습니다. 이것은 bash와 관련이 없습니다.

즉시 출력을 보려면 다음을 수행하십시오.프로그램을 시작하세요 unbuffer(에서expect소프트웨어 패키지). 즉각성을 위해 성능을 교환합니다.

두 번째 문제는 cat이미 내보낸 출력을 표시하고 파일 끝에 도달하자마자 종료된다는 것입니다. 출력을 추가하는 동안 계속해서 출력을 읽으려면 다음을 사용하십시오.tail팔로우 모드.

nohup unbuffer task >out.txt &
tail -n +1 -f out.txt

종료하려면 Ctrl+를 누르세요 . 대신 및 해당 팔로우 모드를 사용할 수 있습니다 ( 읽기를 중지하려면 +를 누르세요 ).CtailtaillessFCtrlC

답변2

tee명령어를 보면 ,여기몇 가지 예가 있습니다.

다음 명령은 tee 명령을 사용하여 출력을 화면(stdout)과 파일에 기록합니다.

$ ls | tee file

관련 정보