
나는 상단의 일부 출력을 기반으로 멋진 csv 파일을 작성하려고 합니다. 다음과 같이 awk를 사용하여 출력을 다시 형식화합니다.
top -b | nawk '/Cpu/ || /Tasks/ { if($1 ~ /Cpu/) { printf "%s,",$3 } else { printf "\n" } }'
완벽하게 작동합니다. 이제 출력을 파일로 저장하고 싶습니다. 나는 다음을 사용하면 효과가 있다고 생각합니다 > output.log
.
top -b | nawk '/Cpu/ || /Tasks/ { if($1 ~ /Cpu/) { printf "%s,",$3 } else { printf "\n" } }' > output.log
그러나 최상위 프로세스에서 Ctrl-C를 누르면 빈 파일이 생성됩니다. 내가 도대체 뭘 잘못하고있는 겁니까?
답변1
Unix의 표준 I/O("stdio") 라이브러리는 어떤 종류의 것(데이터 싱크)에 쓰고 있는지 감지합니다. 터미널(즉, 창)을 감지하면 프로그램이 요청할 때 즉시 데이터를 씁니다. 그러나 파일에 쓸 때 I/O 라이브러리는 데이터를 버퍼링하고 한 번에 512(또는 그 이상) 바이트 블록에 씁니다. 물론 호출 프로그램이 종료될 때 버퍼를 플러시(부분 블록 작성)합니다. 즉, 완전히 종료되는 경우입니다. 비정상적인 종료( Ctrl+ 로 인한 C)로 인해 불완전한 출력 파일이 남을 수 있습니다.
문제를 해결하려면 다음을 시도해 보세요.
top -b | ( trap "" 2; nawk '
(귀하의nawk
명령)' > output.log)
`
이 명령은 명령이 + 에 영향을 받지 않게 trap
만듭니다 . (물론 +는 여전히 프로세스를 종료하고 파이프에서 EOF(파일 끝)에 도달하면 (깨끗하게!) 종료됩니다.nawk
CtrlCCtrlCtop
nawk
PS 이는 실행 중이 bash
거나 bash
호환 가능한 쉘을 가정합니다(필요).
답변2
탑은 계속 달리고 있어요. 제한된 횟수만큼 실행하려고 합니다. -n 옵션을 사용하십시오. 이렇게:
top -b -n 1 | awk '{ ... }'
또는 C-\를 사용하여 top을 종료할 수도 있습니다. Cc를 사용하면 파이프가 중단되고 파이프가 조기에 중단됩니다(awk가 아무것도 가져오기 전에).
$ top -b | cat -n > moo ; wc -l moo
^\Quit
352 moo