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 ...