소개
FRAME Studio는 행사 사진 내보내기에 사용하는 Linux 워크스테이션을 점검하고 있습니다. 긴 세션을 관찰하기 전에 CPU의 비유휴 시간, 즉시 사용할 수 없는 메모리, 내보내기 디렉터리가 있는 파일 시스템의 사용률을 신뢰할 수 있게 읽어야 합니다. 높은 수치는 해석해야 할 신호이며, 작업 실패의 증거는 아닙니다.
짧은 Bash 함수 세 개를 구현하고 실제 Linux 명령을 실행하는 준비된 어댑터를 사용합니다. Shell for Beginners에서 배우는 터미널 경로와 Bash 변수, 함수, 조건문, 반복문의 기초를 알고 있어야 합니다. 명령을 연결하는 프로그램은 준비되어 있습니다. 그 연결을 읽고 백분율 계산 논리를 구현합니다. 이 독립적인 Linux 인스턴스에는 연습용으로 작은 실제 ext4 파일 시스템 두 개가 준비되어 있습니다. 준비와 마운트는 학습자의 작업이 아닙니다. 소요 시간은 읽기와 일반적인 실수를 포함한 저자의 추정치입니다.
CPU 비유휴 시간 측정하기
이 단계에서는 작동하는 리소스 스냅샷을 살펴보고 CPU 변환을 구현합니다.
Terminal에서 시작합니다. 이 실습의 모든 명령은 여기서 실행합니다. 준비된 작업 공간으로 이동하세요. pwd는 현재 위치를, ls는 파일 목록을 보여 줍니다. 나중에 상대 경로의 파일을 찾지 못하면 인스턴스를 초기화하지 말고 이 전체 cd 명령으로 돌아오세요.
명령 입력 방법
입력하기 전에 Terminal 안을 클릭하세요. 명령 블록의 내용만 복사하고 프롬프트, 바깥 백틱, 예상 출력 예제는 입력하지 마세요. 각 명령 뒤에 Enter를 누르고 프롬프트가 돌아온 다음 계속합니다. 성공해도 아무것도 출력하지 않는 명령이 있습니다. 실습 동안 같은 Terminal을 열어 두세요.
cd /home/labex/project/resource-watch
pwd
경로는 /resource-watch로 끝나야 합니다. 준비된 데모를 Bash로 실행합니다.
bash demo.sh
첫 줄은 네 필드의 이름입니다. 다음 줄에는 UTC 타임스탬프와 실제 백분율 세 개가 있습니다. 값은 달라집니다. demo.sh는 제공된 작동 예제이며, 여러분의 함수를 완성하거나 답을 저장하지 않습니다.
UTC timestamp | CPU non-idle % | memory pressure % | target filesystem used %
2026-...Z ... ... ...
CPU 백분율은 이 인스턴스의 가상 CPU 시간을 나타냅니다. vmstat는 시스템 활동을 보고합니다. vmstat 1 2에서 1은 초 단위 간격이고 2는 보고 횟수입니다. 첫 CPU 보고는 부팅 이후 평균이고 두 번째는 새 측정 구간입니다. 필드를 추출하기 전에 실행하세요.
LC_ALL=C vmstat 1 2
LC_ALL=C는 이 명령에 일관된 영어 숫자 형식을 적용합니다. CPU 열에서 id를 찾으세요. 유휴 시간입니다. 이 과정은 비유휴 = 100 - 유휴로 정의합니다. I/O 대기와 스틸 시간도 포함하므로 여러분 프로그램의 실행 시간만을 뜻하거나 장애를 진단하는 값은 아닙니다.
어댑터는 파이프라인을 사용합니다. |는 한 명령의 출력을 다음 명령으로 보냅니다. tail -n 1은 마지막 줄을 선택합니다. awk '{print $15}'는 공백으로 구분된 열다섯 번째 필드, 즉 준비된 procps 버전의 id 열을 출력합니다. 작은따옴표는 $15를 셸에서 확장하지 않고 awk에 전달합니다. 추출한 값이 정수인지 확인합니다.
LC_ALL=C vmstat 1 2 | tail -n 1 | awk '{print $15}'
이제 제공된 함수를 편집합니다. nano는 터미널 편집기입니다. 파일을 열어 : 자리 표시자만 cpu_nonidle 안에서 교체하고 다른 함수는 그대로 두세요. 콜론은 아무것도 하지 않는 자리 표시자입니다.
nano metrics.sh
방향키로 커서를 움직입니다. 첫 함수에서 콜론이 있는 행만 지우고 아래의 들여쓴 두 행을 넣으세요. 함수명, 여닫는 중괄호와 다른 함수는 보존합니다. 전체 함수 예제는 목표 모양이며 원본 밑에 두 번째 복사본을 붙이지 마세요. 들여쓰기는 읽기 편하게 하지만 중괄호와 철자는 정확해야 합니다.
첫 번째 함수는 다음과 같아야 합니다.
cpu_nonidle() {
local idle=$1
echo $((100 - idle))
}
$1은 함수의 첫 번째 인수입니다. local은 변수의 범위를 함수 안으로 제한합니다. $((...))는 정수 연산을 하고 echo는 결과를 출력합니다. Ctrl+O, Enter, Ctrl+X로 저장하고 종료하세요. 나중에 편집하다 구문 오류가 나면 파일을 다시 열어 해당 함수를 수정하세요. 준비된 샘플러는 그대로 유지됩니다.

예제에서는 첫 함수만 완성되었고 나머지 두 콜론은 의도적으로 남아 있습니다. nano 아래쪽의 캐럿은 Ctrl 키를 뜻합니다. 예를 들어 ^O는 두 문자를 입력하는 것이 아니라 Ctrl을 누른 채 O를 누르라는 뜻입니다.

Ctrl+O 뒤에는 아래쪽에서 파일명을 묻습니다. 기존 이름을 유지한 채 Enter로 확인하고 Ctrl+X로 셸 프롬프트에 돌아옵니다. 잘못된 파일을 열었다면 Ctrl+X를 누르고 저장 질문에 N으로 답한 뒤 올바른 파일을 여세요. 편집기를 연 채로 셸 명령을 입력하지 마세요.
source는 현재 셸로 정의를 불러옵니다. Terminal은 Zsh로 시작하지만 이 연습에서는 Bash를 사용합니다. bash -c로 따옴표 안의 테스트를 Bash에서 실행하세요. 바깥 작은따옴표는 안쪽 명령을 그대로 보존합니다.
bash -c 'source ./metrics.sh; cpu_nonidle 97'
3
주어진 유휴 값은 계산을 시험하는 값이며, 현재 백분율이 정확히 3%라는 뜻이 아닙니다. 양 끝값도 확인합니다.
bash -c 'source ./metrics.sh; cpu_nonidle 0; cpu_nonidle 100'
100
0
함수는 0부터 100까지의 모든 정수 유휴 값에서 작동합니다. 실제 샘플러가 새로 측정한 값을 전달합니다.
사용 가능 메모리와 빈 메모리 구분하기
이 단계에서는 Linux가 새 애플리케이션에 사용 가능하다고 추정하는 메모리로 메모리 압박을 계산합니다.
Terminal의 /home/labex/project/resource-watch에 머무르세요. free -k는 1024바이트 단위인 KiB로 메모리를 보여 줍니다. 분석하기 전에 명령을 실행합니다.
LC_ALL=C free -k
Mem: 행을 읽으세요. free는 완전히 사용하지 않는 메모리입니다. available은 회수 가능한 캐시 일부를 포함하여 새 애플리케이션이 스왑 없이 쓸 수 있는 양의 추정치입니다. 모든 캐시를 영구적으로 사용할 수 없다고 보지 마세요. 이 과정에서는 **floor((total - available) * 100 / total)**을 압박 백분율로 사용합니다. 특정한 미래 메모리 할당의 성공을 예측하는 것은 아닙니다.
어댑터는 같은 행에서 전체와 사용 가능 양을 선택합니다. awk에서 /^Mem:/는 Mem:로 시작하는 줄에 일치하고, $2와 $7은 두 번째와 일곱 번째 필드를 선택합니다.
LC_ALL=C free -k | awk '/^Mem:/ {print $2, $7}'
출력은 전체, 사용 가능 순서입니다. 단위가 같으므로 비율이 의미가 있습니다. 예를 들어 전체 1000, 사용 가능 750이면 75%가 아니라 25%입니다.
파일을 열어 memory_pressure 자리 표시자만 교체합니다.
nano metrics.sh
memory_pressure() {
local total=$1 available=$2
echo $(((total - available) * 100 / total))
}
Bash 정수 나눗셈은 소수 부분을 버립니다. 입력은 음수가 아니고 전체는 양수이므로 내림과 같습니다. 소수 부분을 너무 일찍 잃지 않도록 나누기 전에 곱하세요. Ctrl+O, Enter, Ctrl+X로 저장합니다.
bash -c 'source ./metrics.sh; memory_pressure 1000 750; memory_pressure 3 2'
25
33
세 단위 중 한 단위를 사용할 수 없을 때 결과 33은 의도한 값입니다. 계약은 같은 크기의 정수 단위와 0 이상 전체 이하인 사용 가능 값을 사용합니다. 잘못된 입력의 처리는 이 작은 연습 밖에서 다룹니다.
첫 테스트에서는 사용 불가능한 양이 1000 - 750 = 250이므로 250 × 100 ÷ 1000 = 25입니다. 두 번째는 세 단위 중 하나가 불가능하여 33.333…이며 정수를 반환하므로 33이 됩니다. 두 번째 인수는 계산된 백분율이 아니라 사용 가능한 양입니다. 앞 단계에서 완성한 CPU 함수를 보존하세요.
올바른 파일 시스템 샘플링하기
이 단계에서는 파일 시스템 함수를 완성하고 전체 관측 하나를 저장합니다.
Terminal의 /home/labex/project/resource-watch에 머무르세요. exports와 reference 디렉터리는 서로 다른 준비된 ext4 파일 시스템에 있습니다. 양쪽의 원본 자료와 메모를 보존하세요. 공간을 관찰할 뿐입니다. 자료를 삭제하거나 마운트를 변경하거나 파일 시스템을 가득 채우려 하지 마세요.
df는 지정한 경로를 포함하는 파일 시스템을 보고합니다. -P 옵션은 파일 시스템마다 한 줄인 예측 가능한 형식을 제공합니다. 경로를 비교합니다.
df -P exports reference
디렉터리의 파일 수가 아니라 Capacity를 읽으세요. exports 사용률이 reference보다 낮아야 합니다. df /는 다른 파일 시스템을 설명하므로 선택한 대상 대신 쓸 수 없습니다.
nano에서 filesystem_used만 교체합니다.
nano metrics.sh
filesystem_used() {
df -P "$1" | awk 'NR == 2 {gsub(/%/, "", $5); print $5}'
}
큰따옴표는 경로를 하나의 인수로 유지합니다. NR == 2는 헤더 다음 행을 선택합니다. gsub는 다섯 번째 필드의 %를 제거한 뒤 출력합니다. Ctrl+O, Enter, Ctrl+X로 저장합니다. 요청한 파일 시스템에 같은 정수를 반환하는 다른 구현도 허용됩니다.
bash -c 'source ./metrics.sh; filesystem_used exports; filesystem_used reference'
두 숫자는 각자의 df 행과 일치해야 합니다. 마지막으로 준비된 프로그램을 실행합니다.
bash snapshot.sh
이제 UTC 타임스탬프, CPU 비유휴, 메모리 압박, 대상 파일 시스템 사용률을 탭으로 구분하여 출력합니다. CPU와 메모리는 명령 사이에도 변할 수 있습니다. 개별 관측의 연결을 이해하도록 어댑터를 읽습니다.
cat capture.sh
어댑터는 vmstat와 free를 실행하고 함수를 호출하며 df로 대상을 읽습니다. $(...)는 출력을 캡처하고, read -r은 공백으로 구분된 필드를 대입하며, <<<는 캡처한 문자열을 그 읽기에 전달합니다. 연결은 준비되어 있으며, 백분율은 여러분의 함수가 결정합니다.
실제 스냅샷을 저장합니다. >는 출력을 리디렉션하여 이 파일 하나를 교체하며, 원래 운영자 이력은 변경하지 않습니다.
확장자 .tsv는 탭으로 구분된 값을 뜻합니다. 한 행에 관측 하나를 기록하고 필드 사이에 탭을 둡니다. 스냅샷의 네 필드는 UTC 타임스탬프, CPU 비유휴 백분율, 메모리 압박 백분율, 대상 파일 시스템 사용률 순서입니다. UTC는 공통 시간 표준이며 끝의 Z가 UTC를 나타냅니다. 서로 다른 리소스의 백분율이므로 더하거나 합계 100을 기대하지 마세요.
bash snapshot.sh > snapshot.tsv
cat snapshot.tsv
파일명이나 함수명에 오타가 나면 ls를 사용하고 metrics.sh를 다시 열어 수정한 뒤 스냅샷 명령을 반복하세요. 실패한 관측을 지어낸 수치로 대체하지 마세요. 계산과 대상이 명확한 Bash 샘플러가 완성되었습니다.
요약
새 구간의 CPU 비유휴 시간을 측정하고, 사용 가능 메모리로 압박을 계산하고, 실제 대상을 포함한 파일 시스템을 선택했습니다. 세 Bash 함수는 실제 스냅샷을 만듭니다. 다음 독립 실습에서는 이 함수들을 제공하며 경고 규칙과 이력 보존을 추가합니다.



