Linux 시스템 관리 및 모니터링 스크립트 모음

시스템 상태 점검 및 진단

  • ps -al | awk '{print $2, $4}' | grep Z – 제어되지 않은 자식 프로세스(좀비) 확인
  • lynx -dump http://example.com > content.txt – 웹 페이지의 순수 텍스트만 추출
  • curl --head http://example.com – HTTP 헤더 정보만 조회 (다운로드 없이)
  • traceroute example.com – 네트워크 경로에서의 라우팅 게이트웨이 표시
  • lsof -i – 열린 포트와 해당 포트에서 실행 중인 서비스 목록 출력

네트워크 및 파일 전송

  • nc -l 5555 > received_file – 특정 포트 수신 대기 (수신 측)
  • nc target_ip 5555 < send_file – 파일을 원격지로 전송 (송신 측)
  • find . -name "*.txt" -o -name "*.pdf" -print – 지정된 확장자 파일 모두 찾기
  • split -b 10k largefile – 파일을 10KB 단위로 분할
  • comm fileA fileB -3 | sed 's/^\t//' – 두 파일 간 교집합 출력 (공통 항목 제외)

파일 및 디렉토리 관리

  • du -ak /path/to/dir | sort -nrk 1 | head -n 5 – 지정 디렉토리 내 가장 큰 5개 파일 확인
  • sed '/^$/d' input.txt – 빈 줄 제거
  • zip -r backup_$(date +%Y%m%d).zip /source_dir – 특정 시간에 맞춰 디렉토리 압축 백업
  • find /backup -type f -ctime +7 -delete – 7일 이상 된 백업 파일 삭제

데이터베이스 백업 스크립트


#!/bin/bash
set -e

DB_USER="backup"
DB_PASS="backup"
DATA_DIR="/mnt/db-mysql"
BACKUP_DIR="/data/backup/mysql"
LOG_FILE="/var/log/mysql/backup.log"

DATE=$(date +%Y%m%d)
TIME=$(date +%Y%m%d%H)

log() {
    echo "[$(date +%Y-%m-%d %H:%M:%S)] INFO: $*" >> "$LOG_FILE"
}

error() {
    echo "[$(date +%Y-%m-%d %H:%M:%S)] ERROR: $*" >> "$LOG_FILE"
    exit 1
}

full_backup() {
    for db in $(ls -ld "$DATA_DIR"/*/ | awk '{print $9}' | sed 's|.*\/||'); do
        local backup_path="$BACKUP_DIR/full/$db"
        local filename="${db}.${DATE}.sql"
        local full_file="$backup_path/$filename"

        mkdir -p "$backup_path" || error "백업 디렉토리 생성 실패: $backup_path"

        log "전체 백업 시작: $db"
        mysqldump --user="$DB_USER" --password="$DB_PASS" --flush-logs --skip-lock-tables "$db" > "$full_file" || warning "백업 실패: $db"
        
        cd "$backup_path"
        tar -cPzf "${filename}.tar.gz" "$filename"
        rm -f "$full_file"
        chown -R mysql:mysql "$backup_path"
        log "백업 성공: $db"
    done
}

incremental_backup() {
    local start_time=$(date -d "3 hours ago" +%Y-%m-%d %H:%M:%S)
    local purge_time=$(date -d "7 days ago" +%Y-%m-%d %H:%M:%S)

    mysql -u"$DB_USER" -p"$DB_PASS" -e "PURGE MASTER LOGS BEFORE '$purge_time';" && log "오래된 로그 삭제 완료"

    local binlog_files=$(cat "$DATA_DIR"/mysql-bin.index | awk -F/ '{print $NF}')

    for file in $binlog_files; do
        for db in $(ls -ld "$DATA_DIR"/*/ | awk '{print $9}' | sed 's|.*\/||'); do
            local inc_path="$BACKUP_DIR/increment/$db"
            local inc_file="${db}.${TIME}.sql"

            mkdir -p "$inc_path" || error "증분 백업 디렉토리 생성 실패: $inc_path"

            log "증분 백업 시작: $db ($start_time)"
            mysqlbinlog -d "$db" --start-datetime="$start_time" "$DATA_DIR/$file" >> "$inc_path/$inc_file" || warning "증분 백업 실패: $db"
        done
    done

    for db in $(ls -ld "$DATA_DIR"/*/ | awk '{print $9}' | sed 's|.*\/||'); do
        local inc_path="$BACKUP_DIR/increment/$db"
        local inc_file="${db}.${TIME}.sql"

        cd "$inc_path"
        tar -cPzf "${inc_file}.tar.gz" "$inc_file"
        rm -f "$inc_file"
        log "증분 백업 완료: $db"
    done
}

case "$1" in
    full) full_backup ;;
    increment) incremental_backup ;;
    *) echo "사용법: $0 [full|increment]" >&2; exit 1 ;;
esac

성능 모니터링 도구 활용

  • iostat -xkdz 1 – 1초마다 디스크 I/O 통계 출력
  • vmstat 1 – 가상 메모리 사용량 실시간 모니터링
  • mpstat -P ALL 1 – 각 CPU 코어별 부하 상태 확인
  • pidstat -u -r -d -t 1 – 프로세스 기반의 CPU, 메모리, I/O, 스레드 사용률 모니터링
  • sar -pd 10 3 – 블록 장치의 입출력 통계 분석
  • iotop – 프로세스 기반의 디스크 I/O 상황 시각화
  • slabtop -sc – 커널 슬랩 메모리 할당 현황 확인

프로세스 및 시스템 제어

  • ps aux --sort=-pcpu | head -5 – CPU 사용률 상위 5개 프로세스 확인
  • pstree -C – 프로세스 계층 구조 시각화
  • kill -9 PID – 강제 종료 (불응하는 프로세스 처리)
  • nohup command > output.log 2>&1 – 세션 종료 후에도 실행 유지
  • at 12:00 tomorrow << EOF\nreboot\nEOF – 미래 일정에 명령 실행 예약

Java 어플리케이션 진단 스크립트


#!/bin/bash
DUMP_DIR=~/jvm_dumps
mkdir -p "$DUMP_DIR"
DUMP_NAME="dump_$(date +%Y%m%d_%H%M%S)"

for pid in $(pgrep java); do
    # 스레드 덤프
    $JAVA_HOME/bin/jstack "$pid" > "$DUMP_DIR/jstack_$pid.dump" 2>&1
    # JVM 설정 정보
    $JAVA_HOME/bin/jinfo "$pid" > "$DUMP_DIR/jinfo_$pid.dump" 2>&1
    # GC 통계
    $JAVA_HOME/bin/jstat -gcutil "$pid" > "$DUMP_DIR/jstat_gc_$pid.dump" 2>&1
    # 힙 상태
    $JAVA_HOME/bin/jmap -heap "$pid" > "$DUMP_DIR/jmap_heap_$pid.dump" 2>&1
    # 전체 힙 덤프 (서비스 중단 위험)
    $JAVA_HOME/bin/jmap -dump:format=b,file="$DUMP_DIR/jmap_dump_$pid.hprof" "$pid" 2>&1
    # 파일 핸들 정보
    if command -v lsof >/dev/null; then
        lsof -p "$pid" > "$DUMP_DIR/lsof_$pid.dump"
    fi
done

# 시스템 상태 수집
/usr/bin/sar > "$DUMP_DIR/sar.log"
/usr/bin/uptime > "$DUMP_DIR/uptime.log"
/usr/bin/free -t > "$DUMP_DIR/free.log"
/usr/bin/vmstat > "$DUMP_DIR/vmstat.log"

필수 도구 설치 스크립트


#!/bin/bash
yum install -y \
    coreutils \
    net-tools \
    iproute \
    bind-utils \
    iptables \
    curl \
    wget \
    vim \
    emacs \
    git \
    subversion \
    iftop \
    nethogs \
    tcpdump \
    unzip \
    lsof \
    nc \
    traceroute

시스템 진단 메뉴 시스템


#!/usr/bin/env bash
# 주요 정보 수집 및 출력 메뉴 시스템
# - 시스템 정보, 네트워크, 메모리, 디스크, 프로세스, 사용자 등 다양한 요소를 선택적으로 출력
# - 결과는 `sys.log` 파일에 저장 가능

태그: linux Shell scripting system monitoring performance tuning Process Management

7월 29일 02:34에 게시됨