[가상 머신] 웹훅 가져오고, top/free 명령어로 데이터 추출하여, 쉘 스크립트 작성하기 (2)

728x90

`crontab`으로, 매 1분마다 측정된 `CPU 사용량`, `메모리 사용량`, `네트워크 사용량`을 `Discord 웹 훅`을 사용하여, Discord로 보내도록 스크립트를 만들 것이다.

 

3. Discord 웹훅 만들기

Discord가 아니더라도, 알림 시스템 API를 가진 곳이면 사용할 수 있다.

(ex. Microsoft Teams, Discord, 이메일, Telegram, Slack 등)

 

나는 디스코드로 알림을 전송하도록 하였다.

 

1. 우선, 디스코드 서버를 만들고, 알림을 받을 `채널`을 생성한다.

 

2. 생성한 채널 옆, `톱니바퀴` 버튼을 클릭하여 채널 설정에 들어간다.

3. `연동` 카테고리에 들어가, `웹후크`를 클릭한다.

 

4. `새 웹후크` 버튼을 눌러 생성한 뒤, `웹후크 URL 복사` 버튼을 눌러 웹훅 URL을 복사하면 끝이다!

 

이때, 웹훅 URL은 이러한 형식을 가져야 한다.

https://discord.com/api/webhooks/{webhook.id}/{webhook.token}

 

4. top, free 명령어 공부하기

top

`top` 명령어를 통해, 시스템의 전체 정보현재 실행중인 프로세스의 정보를 확인할 수 있다.

`%Cpu` 라인에서, `2.0 us`가 우리가 사용할 데이터인 CPU 사용량이다.

 

가상 머신이 늘어날수록, %Cpu0 %Cpu1 %Cpu2 ... 이렇게 추가된다.

 

> `%Cpu` 라인 <

- `us` : 사용자가 사용한 CPU 시간

- `sy` : 커널이 사용한 CPU 시간

- `ni` : niced 사용자가 프로세스를 실행하는 데 소요된 시간

- `id` : 대기 시간

- `wa` : IO 대기 시간

- `hi` : 하드웨어 인터럽트 사용 시간

- `si` : 소프트웨어 인터럽트 사용 시간

- `st` : 하이퍼바이저가 다른 프로세서를 처리하는 동안 가상 CPU가 대기하는 시간

이때, 숫자 1키를 누르면, 각 cpu 상세 코어마다 목록을 볼 수 있다.

 

> top 명령어의 옵션 <

- `-n` : 지정한 숫자만큼 화면 출력을 갱신한 후 수행

- `-u` : 지정한 사용자의 프로세스를 모니터링

- `-b` : 출력 결과를 파일이나 다른 프로그램으로 전달

- `-d` : 화면 갱신 주기를 초 단위로 설정

- `-p` : 지정한 PID 프로세스를 모니터링

 

free

`free` 명령어를 통해, 전체 메모리(사용하는 메모리, 남은 메모리, 버퍼 메모리)에 대한 상태를 확인한다.

 

> free 명령어의 옵션 <

- `-b` : 바이트 단위로 표현

- `-m` : 메가바이트 단위로 표현

- `-g` : 기가바이트 단위로 표현

- `-k` : 킬로바이트 단위로 표현

- `-l` : 최고/최저 메모리 상황 구분해서 표현

- `-s N` : N초마다 출력

 

5. 쉘 스크립트 작성하기

우선 `touch` 명령어로 `monitor.sh`라는 파일을 생성한 후, `nano` 명령어로 파일 편집기를 연다.

 

이런 식으로 코드를 작성한다.

#!/bin/bash

# Discord Webhook URL 설정
WEBHOOK_URL="https://discord.com/api/webhooks/your-discord-webhook-id/your-webhook-token"

# 현재 시간 가져오기
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

# CPU 사용률 가져오기
CPU_USAGE=$(top -bn1 | grep "%Cpu" | awk '{print $2 + $4}')

# 메모리 사용률 가져오기
MEM_USAGE=$(free | awk '/메모리:/ {print int($3/$2 * 100.0)}')

# 네트워크 RX/TX 사용량 가져오기
RX_BYTES=$(cat /sys/class/net/enp0s3/statistics/rx_bytes)
TX_BYTES=$(cat /sys/class/net/enp0s3/statistics/tx_bytes)

# 바이트를 KB, MB로 변환하는 함수
convert_bytes() {
    local bytes=$1
    if [ "$bytes" -ge $((1024 * 1024 * 1024)) ]; then
        echo "$(printf "%.2f" $(bc -l <<< "$bytes / 1024 / 1024 / 1024")) GB"
    elif [ "$bytes" -ge $((1024 * 1024)) ]; then
        echo "$(printf "%.2f" $(bc -l <<< "$bytes / 1024 / 1024")) MB"
    elif [ "$bytes" -ge 1024 ]; then
        echo "$(printf "%.2f" $(bc -l <<< "$bytes / 1024")) KB"
    else
        echo "$bytes bytes"
    fi
}

# 네트워크 RX/TX 변환
RX_CONVERTED=$(convert_bytes $RX_BYTES)
TX_CONVERTED=$(convert_bytes $TX_BYTES)

# Discord로 측정 결과 알림 전송
MESSAGE="**System Monitoring Report**\n\n
Time: $TIMESTAMP\n
CPU Usage : ${CPU_USAGE}%\n
Memory Usage : ${MEM_USAGE}%\n
Network RX : ${RX_CONVERTED}\n
Network TX : ${TX_CONVERTED}"

# JSON 데이터의 큰따옴표는 이스케이프 처리해야 함
JSON_PAYLOAD=$(printf '{"content": "%s"}' "$MESSAGE")

# curl 명령어를 사용하여 웹훅으로 메시지 전송
curl -H 'Content-Type: application/json' -d "$JSON_PAYLOAD" "$WEBHOOK_URL"

# 알림 로그 파일 생성
touch /monitoring/$TIMESTAMP

 

그리고 `monitoring` 폴더를 생성해주면 된다!

 

 

 

 

 

728x90