시스템 상태 점검 및 진단
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` 파일에 저장 가능