top
리디렉션과 함께 명령을 사용하면 잘 작동합니다.
top > top.log
이제 grep을 사용하여 특정 줄을 필터링하고 싶습니다.
top | grep "my_program" > top.log
그러나 로그 파일은 비어 있는 상태로 유지됩니다. 그러나 grep을 사용하면 출력이 제공됩니다.
top | grep "my_program"
my_program
일부 출력을 보려면 실행 중인 프로그램으로 바꿔야 합니다 .
내 방법이 작동하지 않는 이유는 무엇입니까? 어떻게 해결할 수 있나요?
답변1
나는 당신이 설명하는 것과 동일한 행동을 취합니다. 우분투 11.10에서
top | grep "my_program" > top.log
출력을 생성하지 않습니다.
그 이유는 grep이 출력을 버퍼링하기 때문이라고 생각합니다. GNU grep에게 출력을 한 줄씩 인쇄하도록 지시하려면 다음 --line-buffered
옵션을 사용하십시오:
top | grep --line-buffered "my_program" > top.log
이것도 보세요그래서 질문은다른 잠재적인 솔루션.
답변2
다음을 사용해야 합니다.
top -n 1 | grep "blah" > top.log
"-n 1"은 한 번의 반복으로 최상위로 실행된 다음 몇 초마다 지속적으로 업데이트되는 대신 종료됩니다.
행만 찾고 있으므로 ps를 사용하는 것이 더 나은 도구입니다.
답변3
제가 이 문제를 해결한 방법은 다음과 같습니다.
while :;do top -b -n 1 | grep "my_program" >> top.log;done &
이렇게 하면 백그라운드에서 my_program에 대한 실행 모니터를 제공하고 모든 결과를 top.log 파일에 저장할 수 있습니다.
답변4
둘 다 나에게 도움이 되었지만 Lev Levitsky의 조언이 정확하다고 생각합니다. 인수를 사용하십시오 -b
.
출력 리디렉션이 문제일 가능성이 높으며 stdout을 통해 아무 것도 얻지 못하므로 다음을 시도해 보십시오.
top -b 2>&1 | grep "my_program" > top.log
출력 버퍼링 문제가 발생할 수도 있습니다. 쉘은 이 파일에 지속적으로 기록하지 않으므로 top.log
채우는 데 시간이 걸릴 수 있습니다.