`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` 폴더를 생성해주면 된다!
'💠개발 도구 및 환경 > 시스템 관리' 카테고리의 다른 글
[가상 머신] crontab으로 자동화하고, 결과 확인하기 (3) (0) | 2024.09.04 |
---|---|
[가상 머신] 리눅스 운영체제 설치하고, 가상 환경을 설정하기 (1) (0) | 2024.08.28 |
[가상 머신] 가상화 - 에뮬레이터 vs 가상 머신 vs 컨테이너 (0) | 2024.08.28 |
[쉘 스크립트] 쉘 스크립트 기초 문법에 대해 알아보자 (1) | 2024.08.26 |
[ANSI Escape Code] ANSI Escape Code로 터미널 예쁘게 출력하기 (0) | 2024.08.26 |