시스템 모니터링

시스템 모니터링

1. 시스템 정보

uname - 커널 정보

# 전체 정보
uname -a

# 커널 버전
uname -r

# 운영체제
uname -s

# 하드웨어
uname -m

출력:

Linux server01 5.15.0-91-generic #101-Ubuntu SMP x86_64 GNU/Linux

hostnamectl

hostnamectl

출력:

 Static hostname: server01
       Icon name: computer-vm
         Chassis: vm
      Machine ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
         Boot ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  Virtualization: kvm
Operating System: Ubuntu 22.04.3 LTS
          Kernel: Linux 5.15.0-91-generic
    Architecture: x86-64

lsb_release - 배포판 정보

# Ubuntu/Debian
lsb_release -a

# 또는
cat /etc/os-release

2. CPU 정보

/proc/cpuinfo

# CPU 정보
cat /proc/cpuinfo

# CPU 모델만
grep "model name" /proc/cpuinfo | head -1

# CPU 코어 수
grep -c "processor" /proc/cpuinfo
# 또는
nproc

lscpu

lscpu

출력:

Architecture:          x86_64
CPU(s):                4
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
Model name:            Intel(R) Core(TM) i5-8250U
CPU MHz:               1600.000

CPU 사용률

# top에서 확인
top -bn1 | head -5

# vmstat
vmstat 1 5

# mpstat (sysstat 패키지)
mpstat 1 5

3. 메모리 정보

free - 메모리 사용량

# 기본 출력
free

# 읽기 쉽게
free -h

# 상세 정보
free -h --wide

출력:

              total        used        free      shared  buff/cache   available
Mem:          7.8Gi       3.2Gi       1.5Gi       256Mi       3.1Gi       4.0Gi
Swap:         2.0Gi          0B       2.0Gi
필드 설명
total 전체 메모리
used 사용 중
free 미사용
shared 공유 메모리
buff/cache 버퍼/캐시
available 사용 가능 (free + 해제 가능한 캐시)

/proc/meminfo

# 상세 메모리 정보
cat /proc/meminfo

# 특정 항목
grep -E "MemTotal|MemFree|MemAvailable" /proc/meminfo

4. 디스크 정보

df - 파일시스템 사용량

# 기본 출력
df

# 읽기 쉽게
df -h

# 파일시스템 타입
df -Th

# 특정 경로
df -h /home

출력:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   15G   33G  32% /
/dev/sda2       100G   45G   50G  48% /home
tmpfs           3.9G     0  3.9G   0% /dev/shm

du - 디렉토리 사용량

# 디렉토리 크기
du -sh /var/log

# 하위 폴더별
du -h --max-depth=1 /home

# 가장 큰 디렉토리
du -h --max-depth=1 / 2>/dev/null | sort -hr | head -10

lsblk - 블록 장치

lsblk

출력:

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  100G  0 disk
├─sda1   8:1    0   50G  0 part /
├─sda2   8:2    0   45G  0 part /home
└─sda3   8:3    0    5G  0 part [SWAP]

fdisk - 파티션 정보

sudo fdisk -l

5. 로그 관리

주요 로그 파일

로그 파일 내용
/var/log/syslog 시스템 로그 (Ubuntu)
/var/log/messages 시스템 로그 (CentOS)
/var/log/auth.log 인증 로그 (Ubuntu)
/var/log/secure 인증 로그 (CentOS)
/var/log/kern.log 커널 로그
/var/log/dmesg 부팅 메시지
/var/log/nginx/ Nginx 로그
/var/log/apache2/ Apache 로그

로그 확인

# 시스템 로그 (최근)
tail -100 /var/log/syslog

# 실시간 모니터링
tail -f /var/log/syslog

# 에러 검색
grep -i error /var/log/syslog | tail -20

# 여러 로그 동시 모니터링
tail -f /var/log/syslog /var/log/auth.log

journalctl - systemd 로그

# 전체 로그
journalctl

# 최근 로그
journalctl -n 100

# 실시간
journalctl -f

# 특정 서비스
journalctl -u nginx

# 오늘 로그
journalctl --since today

# 시간 범위
journalctl --since "2024-01-23 00:00" --until "2024-01-23 12:00"

# 부팅 이후
journalctl -b

# 에러만
journalctl -p err

# 커널 로그
journalctl -k

dmesg - 커널 메시지

# 커널 메시지
dmesg

# 최근 메시지
dmesg | tail -50

# 실시간
dmesg -w

# 읽기 쉽게
dmesg -H

6. 크론잡 (cron)

crontab 기본

# 현재 사용자 crontab 보기
crontab -l

# crontab 편집
crontab -e

# 다른 사용자 crontab (root)
sudo crontab -u username -l

cron 형식

* * * * * command
│ │ │ │ │
│ │ │ │ └── 요일 (0-7, 0과 7은 일요일)
│ │ │ └──── 월 (1-12)
│ │ └────── 일 (1-31)
│ └──────── 시 (0-23)
└────────── 분 (0-59)

cron 예시

# 매분 실행
* * * * * /path/to/script.sh

# 매시간 정각
0 * * * * /path/to/script.sh

# 매일 오전 2시
0 2 * * * /path/to/script.sh

# 매주 월요일 오전 3시
0 3 * * 1 /path/to/script.sh

# 매월 1일 자정
0 0 1 * * /path/to/script.sh

# 5분마다
*/5 * * * * /path/to/script.sh

# 평일 오전 9시
0 9 * * 1-5 /path/to/script.sh

# 여러 시간
0 9,12,18 * * * /path/to/script.sh

실무 cron 예시

# 백업 (매일 새벽 3시)
0 3 * * * /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1

# 로그 정리 (매주 일요일 새벽 4시)
0 4 * * 0 find /var/log -name "*.log" -mtime +30 -delete

# 시스템 업데이트 (매주 토요일 새벽 2시)
0 2 * * 6 apt update && apt upgrade -y

# 상태 체크 (10분마다)
*/10 * * * * /home/user/scripts/health_check.sh

시스템 cron 디렉토리

/etc/cron.d/        # cron 설정 파일
/etc/cron.daily/    # 매일 실행
/etc/cron.hourly/   # 매시간 실행
/etc/cron.weekly/   # 매주 실행
/etc/cron.monthly/  # 매월 실행

7. 시스템 부하

uptime - 부하 평균

uptime

출력:

 10:30:00 up 15 days,  3:45,  2 users,  load average: 0.15, 0.10, 0.08
                                                                   
                                                                   └── 15 평균
                                                              └── 5 평균
                                                         └── 1 평균

부하 평균 해석: - CPU 코어 수보다 낮으면 여유 있음 - CPU 코어 수와 같으면 완전 사용 - CPU 코어 수보다 높으면 과부하

vmstat - 가상 메모리 통계

# 1초 간격 5회
vmstat 1 5

출력:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1500000 200000 3000000   0    0     5    10  100  200  2  1 97  0  0
필드 설명
r 실행 대기 프로세스
b 블록된 프로세스
swpd 사용 중인 스왑
si/so 스왑 in/out
bi/bo 블록 in/out
us 사용자 CPU
sy 시스템 CPU
id 유휴 CPU
wa I/O 대기

iostat - I/O 통계

# 설치
sudo apt install sysstat    # Ubuntu
sudo dnf install sysstat    # CentOS

# 사용
iostat -x 1 5

8. 모니터링 스크립트

시스템 상태 리포트

#!/bin/bash
# system_report.sh

echo "=== 시스템 상태 리포트 ==="
echo "날짜: $(date)"
echo

echo "=== 시스템 정보 ==="
uname -a
echo

echo "=== CPU 사용률 ==="
top -bn1 | grep "Cpu(s)" | awk '{print "사용: " 100-$8 "%"}'
echo

echo "=== 메모리 ==="
free -h | grep Mem
echo

echo "=== 디스크 사용량 ==="
df -h | grep -E "^/dev"
echo

echo "=== 부하 평균 ==="
uptime
echo

echo "=== 네트워크 연결 ==="
ss -tuln | grep LISTEN | wc -l
echo "리스닝 포트 수"

디스크 용량 경고

#!/bin/bash
# disk_alert.sh

THRESHOLD=80

df -h | grep -E "^/dev" | while read line; do
    usage=$(echo "$line" | awk '{print $5}' | tr -d '%')
    mount=$(echo "$line" | awk '{print $6}')

    if [ "$usage" -gt "$THRESHOLD" ]; then
        echo "경고: $mount 사용량 ${usage}%"
        # 메일 발송 등 알림 추가 가능
    fi
done

9. 실습 예제

실습 1: 시스템 정보 확인

# 시스템 정보
uname -a
hostnamectl

# CPU 정보
lscpu | head -15

# 메모리
free -h

# 디스크
df -h

실습 2: 로그 분석

# 시스템 로그 확인
sudo tail -50 /var/log/syslog

# 에러 검색
sudo grep -i "error\|fail" /var/log/syslog | tail -20

# 인증 로그 확인
sudo grep "Failed" /var/log/auth.log | tail -10

실습 3: journalctl 사용

# 부팅 이후 로그
journalctl -b --no-pager | tail -50

# 오늘 에러
journalctl --since today -p err

# SSH 서비스 로그
journalctl -u sshd -n 20

실습 4: cron 설정

# crontab 편집
crontab -e

# 테스트 작업 추가 (매분 현재 시간 기록)
# * * * * * date >> ~/cron_test.log

# 확인
crontab -l

# 1분 후 결과 확인
cat ~/cron_test.log

실습 5: 리소스 모니터링

# CPU 부하
uptime

# vmstat 5초 간격
vmstat 5 3

# top에서 CPU/메모리 높은 프로세스
ps aux --sort=-%cpu | head -6
ps aux --sort=-%mem | head -6

다음 단계

12_Security_and_Firewall.md에서 시스템 보안을 배워봅시다!

to navigate between lessons