실제 메모리 사용량을 계산하려면 /proc/meminfo 한 줄을 사용하십시오(memtotal - memfree - 캐시됨 - 버퍼링됨).

실제 메모리 사용량을 계산하려면 /proc/meminfo 한 줄을 사용하십시오(memtotal - memfree - 캐시됨 - 버퍼링됨).

bash에서 내 MOTD와 전면 OLED 디스플레이의 실제 메모리 사용량을 계산하려고 합니다.

안타깝게도 숫자를 kB에서 MB로 올바르게 변환하지 않았습니다. 하지만 공식은 다음과 같습니다 /proc/meminfo.

MemTotal - MemFree - 캐시 - 버퍼

를 사용하여 추출할 수 있습니다 grep -e. 그러나 나는 다음과 같은 점을 주장합니다.

  • 어떻게 값만 grep할 수 있나요 /proc/meminfo?
  • 이 숫자를 kB에서 MB(/1024)로 어떻게 변환합니까?

그래서 내 임무는 위에서 언급한 값을 빼고 그 값을 단일 값으로 인쇄하는 것입니다(덧셈 MB은 보너스입니다).

답변1

GNU를 사용하면 sed다음과 같은 일을 할 수 있습니다.

sed -zE 's_.*MemTotal: *([0-9]*).*\nMemFree: *([0-9]*).*\nBuffers: *([0-9]*).*\nCached: *([0-9]*).*_echo $(((\1-\2-\3-\4)/1024)) MB_e' /proc/meminfo

-z옵션은 단일 버퍼의 전체 파일을 읽어 proc/meminfo단일 정규식에서 4개의 값을 모두 추출하고 그로부터 명령 e의 위험 플래그를 사용하여 명령을 실행하는 계산을 구성합니다 s.

플래그가 있거나 없는 POSIX 버전의 경우 sed명령 대체를 통해 계산에서 추출을 채울 수 있습니다(동일하게 위험함).-zesed

echo $(( ($(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s//-/g' /proc/meminfo)) / 1024)) MB

줄이 길다는 건 알지만 둘 다 한 줄인 것 같아요.

고쳐 쓰다:다른 반올림

설명에서는 빼기 전에 각 값을 MB로 변환하도록 요청합니다. 수정된 스크립트는 다음과 같습니다.

echo $(( $(sed -E '/^(MemTotal|MemFree|Cached|Buffers): *([0-9]*).*/{s//\2/;H;};$!d;x;s/[[:cntrl:]]//;s__/1024-_g;s_$_/1024_' /proc/meminfo))) MB

이로 인해 추가 반올림 오류가 발생합니다. 예를 들어

MemTotal:       16359572 kB
MemFree:         6614000 kB
Buffers:          602108 kB
Cached:          3685372 kB

5330MB 대신 5333MB를 출력합니다(실제 값: 5330.16MB).

관련 정보