예를 들어 여기에 설명되어 있습니다.
free -m 명령에서 사용된 개별 메모리 정보를 가져옵니다.
free
명령의 출력을 자르는 방법 . 하지만 몇 초마다 실행하여 파일에 기록하고 싶습니다. 그래서 나는 다음을 시도한다:
free -g -s2 | sed -n 's/^Mem:\s\+[0-9]\+\s\+\([0-9]\+\)\s.\+/\1/p' >> memory2.log
하지만 파일은 여전히 비어 있습니다. 왜 이런 일이 발생하며 어떻게 해결합니까?
답변1
이는 제가 아는 한 sed
입력이 먼저 버퍼링되어 명령이 끝나지 않아 추가된 부분( >>
)에 도달하지 못하기 때문에 발생합니다. 이 문제를 해결하려면 -u
/ --unbuffered
플래그 를 사용하세요 sed
.
free -g -s2 | sed -u -n 's/^Mem:\s\+[0-9]\+\s\+\([0-9]\+\)\s.\+/\1/p' >> memory2.log
다른 해결책은 while
루프를 사용하는 것입니다.
while true; do free -g | sed -n 's/^Mem:\s\+[0-9]\+\s\+\([0-9]\+\)\s.\+/\1/p'; sleep 1; done >> memory2.log
도움이 되었기를 바랍니다 :)
답변2
더 간단한 명령을 작성하려면 awk를 사용하겠습니다. Awk도 출력 버퍼링을 사용하지만 mawk
내 Ubuntu 데스크탑은 라인 버퍼링을 사용하는 옵션을 지원합니다.
free -g -s2 | awk -W interactive '/^Mem:/ {print $2}'
(참고: 내 컴퓨터에서는 awk
Debian 대체 하위 시스템을 통해 연결됨)mawk
쉘 루프 호출을 실행하면 free | awk
다음과 같습니다 .매우간단한 명령:
while true; do
free -g | awk '/^Mem:/ {print $2}' >> /path/to/memory2.log
sleep 2
done