프로세스 관리

프로세스 관리

1. 프로세스 개념

프로세스는 실행 중인 프로그램의 인스턴스입니다.

┌─────────────────────────────────────────────────────────┐
│                      프로세스                            │
├─────────────────────────────────────────────────────────┤
│  PID: 1234                    (프로세스 ID)              │
│  PPID: 1                      (부모 프로세스 ID)         │
│  UID: 1000                    (실행 사용자)              │
│  상태: Running                                           │
│  메모리: 50MB                                            │
│  CPU: 2%                                                 │
└─────────────────────────────────────────────────────────┘

프로세스 상태

상태 코드 설명
Running R 실행 중 또는 실행 대기
Sleeping S 대기 중 (인터럽트 가능)
Disk Sleep D 대기 중 (인터럽트 불가)
Stopped T 정지됨 (Ctrl+Z)
Zombie Z 종료됐지만 부모가 수거 안 함

프로세스 계층

init/systemd (PID 1)
├── sshd
│   └── bash
│       └── vim
├── nginx
│   ├── nginx worker
│   └── nginx worker
└── cron

2. ps - 프로세스 목록

기본 사용법

# 현재 터미널의 프로세스
ps

# 모든 프로세스
ps aux

# 전체 형식
ps -ef

ps aux 출력 해석

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 168936 11784 ?        Ss   Jan20   0:08 /sbin/init
ubuntu    1234  0.5  1.2 723456 98765 pts/0    Sl   10:00   0:15 /usr/bin/node app.js
필드 설명
USER 실행 사용자
PID 프로세스 ID
%CPU CPU 사용률
%MEM 메모리 사용률
VSZ 가상 메모리 크기
RSS 실제 메모리 사용량
TTY 터미널 (? = 없음)
STAT 상태
START 시작 시간
TIME CPU 사용 시간
COMMAND 명령어

주요 옵션

# 모든 프로세스 (BSD 스타일)
ps aux

# 모든 프로세스 (UNIX 스타일)
ps -ef

# 특정 사용자 프로세스
ps -u ubuntu

# 특정 프로세스
ps -p 1234

# 트리 형태
ps auxf
ps -ef --forest

# 특정 명령 검색
ps aux | grep nginx

pstree - 프로세스 트리

# 전체 트리
pstree

# PID 표시
pstree -p

# 특정 사용자
pstree ubuntu

# 특정 PID 기준
pstree -p 1234

3. top - 실시간 모니터링

기본 사용법

top

출력:

top - 10:30:00 up 5 days,  3:45,  2 users,  load average: 0.15, 0.10, 0.05
Tasks: 120 total,   1 running, 119 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.0 us,  1.0 sy,  0.0 ni, 96.5 id,  0.5 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7976.0 total,   2048.0 free,   3500.0 used,   2428.0 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   4000.0 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 1234 ubuntu    20   0  723456  98765  12345 S   5.0   1.2   0:15.23 node
 5678 mysql     20   0 1234567 234567  23456 S   2.0   2.9   1:23.45 mysqld

top 헤더 설명

항목 설명
load average 1분, 5분, 15분 평균 부하
us 사용자 프로세스 CPU
sy 시스템(커널) CPU
ni nice된 프로세스 CPU
id 유휴 CPU
wa I/O 대기

top 단축키

동작
q 종료
k 프로세스 kill
r nice 값 변경
M 메모리 순 정렬
P CPU 순 정렬
1 CPU 개별 표시
c 전체 명령어 표시
f 필드 선택
h 도움말

htop - 향상된 top

# 설치
# Ubuntu/Debian
sudo apt install htop

# CentOS/RHEL
sudo dnf install htop

# 실행
htop

htop 특징: - 컬러 인터페이스 - 마우스 지원 - 스크롤 가능 - 프로세스 트리 보기 - 검색 기능


4. 프로세스 제어

kill - 프로세스 종료

# 기본 종료 (SIGTERM)
kill 1234

# 강제 종료 (SIGKILL)
kill -9 1234
kill -KILL 1234

# 시그널 목록
kill -l

주요 시그널

시그널 번호 설명
SIGHUP 1 재시작/설정 다시 읽기
SIGINT 2 인터럽트 (Ctrl+C)
SIGQUIT 3 종료 + 코어 덤프
SIGKILL 9 강제 종료 (무시 불가)
SIGTERM 15 정상 종료 (기본값)
SIGSTOP 19 일시 정지
SIGCONT 18 재개
# 종료 요청 (graceful)
kill -TERM 1234

# 강제 종료 (마지막 수단)
kill -9 1234

# 설정 다시 읽기
kill -HUP 1234

# 프로세스 일시 정지
kill -STOP 1234

# 프로세스 재개
kill -CONT 1234

killall - 이름으로 종료

# 이름으로 종료
killall nginx

# 강제 종료
killall -9 node

# 대화형 확인
killall -i process_name

pkill - 패턴으로 종료

# 패턴 매칭
pkill -f "python app.py"

# 사용자의 프로세스
pkill -u username

# 시그널 지정
pkill -9 -f "node server.js"

pgrep - 프로세스 ID 찾기

# PID 찾기
pgrep nginx

# 상세 정보
pgrep -a nginx

# 특정 사용자
pgrep -u root sshd

5. 포그라운드와 백그라운드

포그라운드 (Foreground)

터미널을 점유하고 실행됩니다.

# 일반 실행 (포그라운드)
./long_running_script.sh

백그라운드 (Background)

터미널을 점유하지 않고 실행됩니다.

# 백그라운드 실행
./long_running_script.sh &

# 출력 리다이렉트
./script.sh > output.log 2>&1 &

작업 제어

# 포그라운드 작업 일시 정지
# Ctrl + Z

# 백그라운드 작업 목록
jobs

# 백그라운드로 보내기
bg %1

# 포그라운드로 가져오기
fg %1

# 작업 종료
kill %1

nohup - 로그아웃 후에도 실행

# 로그아웃해도 계속 실행
nohup ./script.sh &

# 출력 지정
nohup ./script.sh > output.log 2>&1 &

# PID 확인
echo $!

disown - 터미널과 분리

# 백그라운드 실행 후 분리
./script.sh &
disown

# 또는 바로 분리
./script.sh &
disown %1

6. systemctl - 서비스 관리

서비스 상태 확인

# 상태 확인
systemctl status nginx

# 실행 중인 서비스 목록
systemctl list-units --type=service

# 활성화된 서비스
systemctl list-units --type=service --state=running

# 실패한 서비스
systemctl --failed

서비스 제어

# 시작
sudo systemctl start nginx

# 중지
sudo systemctl stop nginx

# 재시작
sudo systemctl restart nginx

# 설정 다시 읽기 (중단 없이)
sudo systemctl reload nginx

# 재시작 또는 reload
sudo systemctl reload-or-restart nginx

부팅 시 자동 시작

# 자동 시작 활성화
sudo systemctl enable nginx

# 자동 시작 비활성화
sudo systemctl disable nginx

# 활성화 상태 확인
systemctl is-enabled nginx

# 활성화하면서 바로 시작
sudo systemctl enable --now nginx

서비스 로그 확인

# 서비스 로그
journalctl -u nginx

# 실시간 로그
journalctl -u nginx -f

# 최근 100줄
journalctl -u nginx -n 100

# 오늘 로그
journalctl -u nginx --since today

7. 프로세스 우선순위

nice - 우선순위 설정

nice 값: -20(높은 우선순위) ~ 19(낮은 우선순위), 기본값 0

# 낮은 우선순위로 실행
nice -n 10 ./heavy_task.sh

# 높은 우선순위 (root 필요)
sudo nice -n -10 ./important_task.sh

renice - 실행 중인 프로세스 우선순위 변경

# 우선순위 변경
renice -n 10 -p 1234

# 사용자의 모든 프로세스
sudo renice -n 5 -u username

8. 실습 예제

실습 1: 프로세스 모니터링

# 현재 프로세스 확인
ps aux | head -20

# 특정 프로세스 찾기
ps aux | grep sshd

# 프로세스 트리
pstree -p | head -30

# 실시간 모니터링
top
# (q로 종료)

실습 2: 백그라운드 작업

# 테스트 스크립트 생성
cat > test_bg.sh << 'EOF'
#!/bin/bash
for i in {1..10}; do
    echo "Count: $i"
    sleep 2
done
EOF
chmod +x test_bg.sh

# 포그라운드 실행 후 Ctrl+Z로 정지
./test_bg.sh
# Ctrl+Z

# 작업 목록 확인
jobs

# 백그라운드로 보내기
bg %1

# 다시 포그라운드로
fg %1

실습 3: 프로세스 종료

# sleep 프로세스 실행
sleep 300 &
echo "PID: $!"

# 프로세스 확인
ps aux | grep sleep

# 종료
kill $!

# 확인
ps aux | grep sleep

실습 4: 서비스 관리

# SSH 서비스 상태
systemctl status sshd

# 로그 확인
journalctl -u sshd -n 20

# 실행 중인 서비스 목록
systemctl list-units --type=service --state=running

실습 5: 리소스 모니터링

# CPU 많이 사용하는 프로세스 (top 5)
ps aux --sort=-%cpu | head -6

# 메모리 많이 사용하는 프로세스 (top 5)
ps aux --sort=-%mem | head -6

# 프로세스 수
ps aux | wc -l

# 좀비 프로세스 확인
ps aux | grep Z

다음 단계

08_Package_Management.md에서 패키지 관리를 배워봅시다!

to navigate between lessons