상단을 통해 grep으로 파이프되면 출력 리디렉션이 작동하지 않습니다.

상단을 통해 grep으로 파이프되면 출력 리디렉션이 작동하지 않습니다.

Linux에서 이 명령을 실행하면 다음과 같습니다.

$ top -b -d 20 | grep "load average" -A 20 > top.log

top.log는 항상 비어 있습니다.

하지만 이 명령을 실행하면:

$ top -b -d 20 | grep "load average" -A 20 | tee top.log

그런 다음 top.log에 내용이 있습니다.

이를 사용하고 싶지 않은 경우 tee(출력이 콘솔에 표시되는 것을 원하지 않기 때문에) top.log가 업데이트되도록 첫 번째 명령을 수정하려면 어떻게 해야 합니까?

내 컴퓨터는 CentOS Linux 7(코어)을 사용합니다.

답변1

--line-buffered이 옵션을 사용해야 합니다 grep(귀하의 질문에 "centos" 태그가 지정되었으므로 확실히 GNU grep을 사용하고 있는 것입니다).

기본적으로 grep라인 버퍼링은 출력이 터미널에 대한 것일 때만 사용됩니다(stdio 함수와 마찬가지로 printf, puts 등). 이 --line-buffered옵션은 이를 재정의합니다. GNU coreutils에는 stdio를 사용하는 모든 동적 링커에서 작동하는 stdbuf(1) 래퍼도 있습니다.

답변2

cat /proc/loadavg간격을 두고 사용 하시면 됩니다 . 왜 꺼내나요 top? 이는 활성 모니터링(주로)에 사용되며 항상 읽는 것보다 빠릅니다 loadavg. 프로세스 목록의 경우 을 사용 ps하고 —sort플래그를 사용하여 정렬하세요. 예를 들어

( while true ; do cat /proc/loadavg ; ps -aux | sort -nrk 3,3 | head -n 20 ; sleep 3 ; done ; ) | pipe ...

또는

( while true ; do cat /proc/loadavg ; ps -Ao user,uid,pid,comm,pcpu,tty —sort=-pcpu —no-headers | head -n 20 ; sleep 3 ; done ; ) | pipe ...

관련 정보