소개
FRAME Studio에는 사라지는 터미널 화면이 아니라 작업 세션의 짧은 기록이 필요합니다. 이 독립 인스턴스의 리소스 샘플러는 이미 완성되어 있습니다. 관측을 명확한 경고로 바꾸고 기존 운영자 기록을 잃지 않고 추가합니다.
측정값 분류, 완전한 행 기록, 준비된 샘플링 동작 반복이라는 세 함수를 구현합니다. Bash 변수, 함수, 조건문, 반복문의 기초가 필요합니다. 첫 실습이 지표를 설명하지만 그 파일은 필요하지 않습니다. 한계값은 로컬 교육 정책이며 보편적인 운영 환경 권장값이 아닙니다. 시간은 저자의 추정치입니다.
각 측정값에 명확한 상태 부여하기
이 단계에서는 백분율과 한계값을 재사용 가능한 경고 판단으로 바꿉니다.
Terminal에서 시작합니다. 이 독립 인스턴스에는 작동하는 metrics.sh가 이미 있습니다. 이전 파일은 필요하지 않습니다. 작업 공간으로 이동합니다.
cd /home/labex/project/resource-watch
현재 측정값을 봅니다.
bash snapshot.sh
탭으로 구분된 네 필드는 UTC 타임스탬프, CPU 비유휴, 메모리 압박, 대상 파일 시스템 사용률입니다. 운영 서버 집합이 아니라 이 인스턴스를 설명합니다. 리소스 경고가 사진 내보내기 실패를 증명하지는 않습니다.
cat은 정책을 수정하지 않고 보여 줍니다.
cat policy.sh
세 한계값과 대상 및 로그의 전체 경로를 읽으세요. 이 단원의 CPU와 메모리 한계는 80, 디스크는 50입니다. 교육용 설정입니다. 규칙은 측정값이 자신의 한계값 이상이면 WARN, 그렇지 않으면 OK입니다. 같을 때도 중요합니다. 제공된 정책과 샘플러를 보존하세요.
nano로 미완성 함수를 엽니다.
이 실습은 준비된 작동하는 측정 파일에서 다시 시작합니다. 이전 측정 파일을 복사하지 말고 다음 명령이 지정하는 모니터링 함수 파일을 편집하세요. 정책의 세 LIMIT 값은 정수 백분율이며 TARGET은 관찰 디렉터리, LOG은 저장 이력 경로입니다. 정책을 읽어도 내용은 바뀌지 않습니다.
nano monitor-functions.sh
classify만 다음으로 교체합니다.
classify() {
if (( $1 >= $2 )); then
echo WARN
else
echo OK
fi
}
첫 인수는 측정값, 두 번째는 한계값입니다. ((...))는 숫자를 비교하며 >=는 같은 경우도 포함합니다. 두 분기 모두 상태를 출력합니다. 정상값도 조용히 끝나지 않고 OK를 출력합니다. Ctrl+O, Enter, Ctrl+X로 저장합니다.
source는 정의를 불러옵니다. 대화형 셸은 Zsh이므로 테스트는 bash -c 안에서 실행합니다. 작은따옴표는 Bash에 전달할 명령을 보존합니다.
bash -c 'source ./monitor-functions.sh; classify 79 80; classify 80 80; classify 81 80'
OK
WARN
WARN
주어진 값은 규칙을 시험하는 것이며 현재 CPU 측정값이 아닙니다. 항상 WARN 또는 OK만 반환하는 함수는 오늘 워크스테이션 상태가 우연히 맞더라도 잘못된 것입니다.
완전한 모니터링 레코드 추가하기
이 단계에서는 이력을 교체하지 않고 모든 측정값과 독립적인 상태를 기록합니다.
Terminal의 /home/labex/project/resource-watch에 머무르세요. 먼저 운영자 이력을 읽습니다.
cat history.tsv
원래 행은 맨 앞에 바이트 단위로 동일하게 남아야 합니다. history.tsv는 손으로 채우는 보고서가 아니라 실제 결과물입니다. 각 새 행에는 UTC 타임스탬프, CPU, 메모리, 디스크, 이어서 CPU 상태, 메모리 상태, 디스크 상태 순으로 탭 구분된 일곱 필드가 있습니다.
함수를 엽니다.
nano monitor-functions.sh
record_sample만 교체합니다.
record_sample() {
local stamp=$1 cpu=$2 memory=$3 disk=$4 logfile=$5
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
"$stamp" "$cpu" "$memory" "$disk" \
"$(classify "$cpu" "$CPU_LIMIT")" \
"$(classify "$memory" "$MEMORY_LIMIT")" \
"$(classify "$disk" "$DISK_LIMIT")" >> "$logfile"
}
printf는 각 %s를 대체하고, \t는 탭을 쓰고, \n은 행을 끝냅니다. 행 끝의 역슬래시는 같은 명령을 다음 줄로 이어 줍니다. $(...)는 함수 출력을 캡처합니다. 큰따옴표는 각 값과 공백을 포함한 로그 경로를 보존합니다. >>는 추가하며 >는 기존 기록을 지웁니다. Ctrl+O, Enter, Ctrl+X로 저장합니다.
별도의 연습 파일에서 주어진 레코드를 시험합니다. source ./policy.sh는 이 Bash 프로세스에 한계값을 불러옵니다. 다른 터미널이나 이후의 bash -c 호출에 자동으로 남지 않습니다.
bash -c 'source ./policy.sh; source ./monitor-functions.sh; record_sample 2026-01-02T03:04:05Z 10 85 20 practice.tsv'
cat practice.tsv
2026-01-02T03:04:05Z 10 85 20 OK WARN OK
메모리 경고는 85를 80과 비교하며 다른 상태까지 WARN으로 만들지 않습니다. 호출을 반복하면 연습 행이 하나 더 추가됩니다. history.tsv에 예제를 넣지 마세요. 실제 샘플링 전용 파일입니다.
연습 예제의 일곱 필드를 왼쪽부터 읽습니다.
| 필드 | 예제 | 의미 |
|---|---|---|
| 1 | 2026-01-02T03:04:05Z | UTC 시간이며 Z는 UTC를 뜻함 |
| 2 | 10 | CPU 비유휴 백분율 |
| 3 | 85 | 메모리 압박 백분율 |
| 4 | 20 | 대상 파일 시스템 사용률 |
| 5 | OK | CPU 10은 자기 한계 80 미만 |
| 6 | WARN | 메모리 85는 자기 한계 80 이상 |
| 7 | OK | 디스크 20은 자기 한계 50 미만 |
Terminal에서 탭은 너비가 다른 공백처럼 보일 수 있습니다. 함수가 만든 실제 탭을 유지하고 실제 이력을 공백으로 직접 정렬하지 마세요. 원래 운영자 행은 준비된 배경이므로 날짜가 이전인 것이 정상입니다. 이 주어진 예제는 별도 연습 파일에만 기록합니다.
횟수를 제한해 관찰하고 이력 보존하기
이 단계에서는 실제 측정을 반복하고 결과를 확인하며 진행 상황을 잃지 않고 이어서 실행합니다.
Terminal의 /home/labex/project/resource-watch에 머무르세요. 준비된 monitor.sh는 capture_once target logfile을 제공합니다. 새 관측을 얻고 기록 함수를 호출한 뒤 저장된 행을 보여 줍니다. run_monitor는 경로를 그대로 전달하고 요청된 횟수만큼 정확히 동작을 호출해야 합니다. 각 캡처에는 새로운 1초 CPU 구간이 들어갑니다. 횟수가 제한된 관측이며 정밀 스케줄러가 아닙니다.
nano monitor-functions.sh
이 함수만 다음으로 교체합니다.
run_monitor() {
local count=$1 target=$2 logfile=$3
local n
for ((n = 0; n < count; n++)); do
capture_once "$target" "$logfile"
done
}
산술 반복문은 0부터 시작하여 n이 count보다 작은 동안 계속하며 매 캡처 후 n을 증가시킵니다. 따옴표는 두 경로를 보존합니다. 동등한 while 반복문도 유효합니다. Ctrl+O, Enter, Ctrl+X로 저장합니다.
실제 샘플 세 개를 실행합니다.
bash monitor.sh 3
프롬프트가 돌아오기 전에 세 행이 나타나야 합니다. 각 UTC 타임스탬프는 이전 것보다 나중이어야 합니다. 실제 값은 변하며 정상 실행에서 경고가 없을 수도 있습니다. 프로그램은 1~30회 샘플을 받습니다. 긴 관찰 중에는 Ctrl+C로 전면 스크립트를 멈추며 추가된 행은 남습니다. 다른 프로세스를 종료할 필요는 없습니다.
결과를 읽고 행 수를 셉니다. wc -l은 줄바꿈으로 끝나는 행을 셉니다.
cat history.tsv
wc -l history.tsv
설명한 첫 실행 후에는 원래 한 행과 새 세 행, 총 네 행이어야 합니다. 추가 샘플을 얻었다면 더 많습니다. 유효한 관측은 보존하세요.
한 번 더 측정합니다.
bash monitor.sh 1
wc -l history.tsv
총수가 하나 늘어납니다. 기록 함수가 교체가 아닌 추가를 하므로 반복해도 안전합니다. 각 상태를 해당 측정값 및 policy.sh의 한계값과 비교하세요.
일반적인 입력 오류를 의도적으로 시험합니다. 0은 샘플링 전에 거부됩니다.
bash monitor.sh 0
Use a sample count from 1 to 30.
예상된 실패이며 종료 상태는 2, 이력은 바뀌지 않습니다. VM을 초기화하거나 이력을 편집하지 말고 유효한 횟수로 복구합니다.
bash monitor.sh 1
새 행이 추가됩니다. 준비된 샘플러는 불완전한 지표도 거부하며, 그럴듯해 보이는 빈 관측을 추가하지 않습니다.
결과 확인
- 원래 운영자 행이 맨 앞에 남고 새 관측이 뒤에 이어집니다.
- 첫 실행은 세 행, 한 번 이어서 측정하면 한 행을 추가합니다. 명령 반복으로 유효한 행이 더 생겨도 됩니다.
- 세 백분율을 먼저 읽고 각각 자신의 한계값과 비교하세요. 모두 OK여도 유효한 결과입니다. 경고를 보려고 부하를 만들거나 파일을 지울 필요는 없습니다.
- 매 캡처는 새 CPU 구간을 기다립니다. 짧은 대기는 정상이므로 샘플링 중 Enter를 반복해서 누르지 마세요. 프롬프트가 돌아오면 제한된 실행이 끝난 것입니다. Terminal을 닫는다고 연속 모니터가 계속 실행되지는 않습니다.
요약
같을 때도 경고하는 규칙을 구현하고, 독립적인 세 상태가 포함된 완전한 기록을 추가하며, 이력을 보존한 채 실제 샘플링을 반복했습니다. 이제 짧은 관측을 실행하고 증거를 읽고 이어 갈 수 있습니다. 독립 챌린지는 배운 도구와 계약을 재사용하면서 대상과 정책을 바꿉니다.



