기타 / 자격증 / 리눅스마스터 2급 / 7강

7편 · 프로세스 관리 — 확인·제어·종료·작업

이번 강의에서 배울 것

  • PID·PPID, 프로세스 상태 코드(R·S·D·T·Z)와 프로세스 유형(데몬·고아·좀비)을 설명한다.
  • ps·pstree·top·pgrep 출력의 주요 필드와 옵션을 읽는다.
  • nice·renice로 우선순위를 바꾸고, kill·killall·pkill과 시그널 번호(1·2·9·15·18·19·20)를 쓴다.
  • jobs·fg·bg·nohup으로 작업을 제어하고, at과 crontab 다섯 필드로 작업을 예약한다.

학습 경로 · 2과목 3장

← 6편 · 셸 · 다음: 8편 · 에디터 vi/vim →

범위: 2과목 3장 "프로세스 관리" — 프로세스의 개념과 유형, 프로세스 확인(ps, pstree, top, pgrep), 우선순위(nice, renice), 시그널과 종료(kill, killall, pkill), 작업 제어(jobs, fg, bg, nohup), 작업 예약(at, cron).

형광펜 읽는 법: 노랑 핵심 정의·결론 · 빨강 시험에서 헷갈리는 구분·함정 · 파랑 외워야 할 순서·목록


단원 도입

출제 포인트빈도이렇게 나온다
시그널 번호와 이름 (1, 2, 9, 15, 18, 19, 20)★★★"kill의 기본 시그널은?", 번호 ↔ 이름
crontab 필드 순서와 해석★★★예약 문장 → crontab 줄 고르기
ps 옵션과 출력 필드 (aux, -ef, STAT)★★★"PPID까지 보이는 옵션은?"
nice 값 범위·renice 사용법★★★범위 -20–19, 일반 사용자 제약
jobs·fg·bg·Ctrl+Z★★정지된 작업을 백그라운드로 보내기
좀비·고아·데몬★★설명 → 용어
nohup, at, atq, atrm★★로그아웃 후에도 실행, 1회성 예약
top 대화형 키, pstree, pgrep/pkill★키 → 기능

PART 1 · 프로세스란 무엇인가

1. 프로세스의 개념

핵심 필기

용어뜻
PID (Process ID)커널이 프로세스마다 붙이는 고유 번호
PPID (Parent PID)이 프로세스를 만든 부모 프로세스의 PID
PID 1부팅 때 커널이 처음 띄우는 프로세스 — systemd(예전엔 init). 모든 프로세스의 조상
fork부모가 자기 자신을 복제해 자식 프로세스를 만드는 것 (새 PID)
exec현재 프로세스의 내용을 새 프로그램으로 덮어써서 실행 (PID 유지)

2. 프로세스 상태

핵심 필기

ps의 STAT(S) 열에 나오는 상태 코드:

코드상태뜻
RRunning / Runnable실행 중이거나 실행 대기(run queue)
SInterruptible Sleep이벤트를 기다리며 잠듦 — 시그널로 깨울 수 있음 (대부분이 이 상태)
DUninterruptible Sleep주로 디스크 I/O를 기다림 — 시그널로 깨울 수 없음
TStopped시그널(SIGSTOP·SIGTSTP)로 정지됨
ZZombie종료했지만 부모가 회수하지 않아 프로세스 테이블에 남음 (<defunct>)
IIdle유휴 커널 스레드

STAT 뒤에 붙는 보조 기호: < 높은 우선순위, N 낮은 우선순위, s 세션 리더, l 멀티스레드, + 포그라운드 프로세스 그룹.

실행 대기 R과 실행 중 상태가 서로 오가고, 이벤트 대기로 S·D, SIGSTOP·SIGTSTP로 정지 T, SIGCONT로 복귀, 종료 후 부모가 회수하기 전까지 좀비 Z가 되는 상태 전이도

그림 7-1 · 프로세스 상태 전이와 시그널 — 누르면 원본 크기로 열린다.

$ sleep 50 &
$ kill -STOP %1; ps -o pid,stat,cmd -p $!
  PID STAT CMD
 1653 T    sleep 50
$ kill -CONT %1; ps -o pid,stat,cmd -p $!
  PID STAT CMD
 1653 S    sleep 50

3. 프로세스의 유형

핵심 필기

유형뜻
포그라운드(Foreground)터미널을 차지하고 실행 — 끝날 때까지 프롬프트가 돌아오지 않음
백그라운드(Background)명령 뒤에 & — 프롬프트를 바로 돌려받고 뒤에서 실행
데몬(Daemon)터미널 없이(TTY ?) 백그라운드에서 요청을 기다리며 상주하는 서비스 프로세스. 이름 끝에 d가 많다(sshd, httpd, crond)
고아(Orphan)부모가 먼저 종료된 자식 — PID 1(systemd/init)이 새 부모가 되어 거둔다
좀비(Zombie)자식은 종료했는데 부모가 종료 상태를 회수(wait)하지 않아 프로세스 테이블에 항목만 남은 것

데몬 실행 방식: standalone(항상 메모리에 상주, 응답 빠름, 예: httpd) vs inetd/xinetd(슈퍼 데몬이 요청이 올 때만 해당 서비스를 띄움, 자원 절약, 예: telnet). 현재 배포판은 systemd가 서비스를 관리한다.

$ ps -eo pid,ppid,stat,cmd | grep -E 'parent|defunct'
 1582     1 S    parent ...
 1584  1582 Z    [python3] <defunct>

PART 2 · 프로세스 확인

4. ps — 프로세스 스냅숏

핵심 필기

ps는 세 가지 옵션 문법을 받는다: 유닉스(System V) 스타일 -e -f, BSD 스타일(하이픈 없음) a u x, GNU 긴 옵션 --sort.

옵션뜻
(없음)현재 터미널에서 실행한 내 프로세스만
-e, -A모든 프로세스
-f풀 포맷 — UID, PPID, C, STIME, CMD 표시
-l롱 포맷 — F, S, PRI, NI, WCHAN 등
-u 사용자특정 사용자의 프로세스
-p PID특정 PID
-o 필드,…출력할 필드를 직접 지정
a터미널에 연결된 모든 사용자의 프로세스
u사용자 중심 포맷(USER, %CPU, %MEM…)
x터미널이 없는 프로세스(데몬)까지
$ ps aux | head -3
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  25892  6596 ?        Ss   09:16   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    09:16   0:00 [kthreadd]
$ ps -ef | head -3
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 09:16 ?        00:00:01 /sbin/init
root         2     0  0 09:16 ?        00:00:00 [kthreadd]
$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1001  2210  2209  0  80   0 -  2024 do_wai pts/0    00:00:00 bash
4 R  1001  2301  2210  0  80   0 -  2516 -      pts/0    00:00:00 ps
필드뜻
USER / UID소유자
%CPU, %MEMCPU·메모리 사용률
VSZ가상 메모리 크기(KB)
RSS실제 물리 메모리 사용량(KB)
TTY연결된 터미널 (? = 터미널 없음, 데몬)
STAT / S상태 코드
START / STIME시작 시각
TIME누적 CPU 사용 시간
CCPU 사용률(스케줄링용)
PRI / NI우선순위 / nice 값

5. pstree · top · pgrep

핵심 필기

pstree — 프로세스의 부모-자식 관계를 트리 모양으로 출력.

옵션뜻
-pPID 함께 표시
-uUID가 바뀌는 지점에 사용자 이름 표시
-h현재 프로세스와 조상 강조
-n이름 대신 PID 순 정렬
$ pstree -p | head -3
systemd(1)-+-sshd(812)---sshd(2205)---bash(2210)---pstree(2330)
           |-crond(790)
           `-rsyslogd(745)-+-{rsyslogd}(750)

top — 실시간으로 갱신되는 프로세스 모니터.

$ top -b -n 1 | head -8
top - 17:21:47 up 4 min,  0 user,  load average: 0.63, 0.33, 0.13
Tasks:  80 total,   1 running,  79 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  16091.2 total,  14776.1 free,    718.1 used,    900.6 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.  15373.0 avail Mem
 
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
  812 root      20   0   15432   9120   7680 S   0.3   0.1   0:00.42 sshd
실행 옵션뜻대화형 키뜻
-d 초갱신 간격h, ?도움말
-p PID특정 PID만q종료
-u 사용자특정 사용자만kkill — PID와 시그널 입력
-b배치 모드(파일로 저장할 때)rrenice — nice 값 변경
-n 횟수갱신 횟수 후 종료P / M / TCPU / 메모리 / 시간 순 정렬
u사용자 필터
space즉시 갱신

pgrep / pkill — 이름·사용자·터미널 조건으로 PID를 찾거나(pgrep) 시그널을 보낸다(pkill).

옵션뜻
-l이름도 함께 출력 (pgrep)
-u 사용자사용자 조건
-t 터미널터미널 조건 (예: -t pts/1)
-x이름이 정확히 일치
-f전체 명령행으로 검색
-n / -o가장 최근 / 가장 오래된 하나
$ pgrep -l sshd
812 sshd
2205 sshd
$ pgrep -u kim -l
3101 bash
3150 vim

PART 3 · 우선순위와 시그널

6. nice · renice — 우선순위 조정

핵심 필기

명령뜻
nice 명령nice 값을 기본 10만큼 증가시켜 실행
nice -n 10 명령NI를 10 증가시켜 실행
nice -10 명령NI를 10 증가 (옛 표기, -n 10과 같음)
nice --10 명령NI를 10 감소(= -10) — root만 가능
renice 값 -p PID실행 중인 프로세스의 NI를 그 값으로 지정
renice 값 -u 사용자해당 사용자의 모든 프로세스
renice 값 -g 그룹프로세스 그룹
$ nice -n 10 sleep 30 &
$ ps -o pid,ni,cmd -p $!
  PID  NI CMD
 1025  10 sleep 30
$ renice -n 5 -p 1025
1025 (process ID) old priority 10, new priority 5
$ renice +15 1025
1025 (process ID) old priority 5, new priority 15

7. 시그널과 kill · killall · pkill

핵심 필기

번호이름기본 동작언제
1SIGHUP종료터미널 연결이 끊김. 데몬에게는 설정 파일 다시 읽기로 자주 씀
2SIGINT종료키보드 Ctrl+C
3SIGQUIT종료 + 코어 덤프키보드 Ctrl+\
9SIGKILL강제 종료무시 불가, 정리 작업 없이 즉시
11SIGSEGV종료 + 코어 덤프잘못된 메모리 접근
15SIGTERM종료kill의 기본 시그널, 정상 종료 요청
17SIGCHLD무시자식이 종료·정지되었음을 부모에게 알림
18SIGCONT재개정지된 프로세스를 다시 실행 (fg·bg가 사용)
19SIGSTOP정지무시 불가 정지
20SIGTSTP정지키보드 Ctrl+Z
$ kill -l | head -4
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
$ kill -l 15
TERM
$ kill -l TERM
15

종료 명령 비교

명령대상 지정예
killPID 또는 작업 번호(%n)kill 1234, kill -9 1234, kill -s KILL 1234, kill -SIGKILL 1234, kill %1
killall프로세스 이름killall httpd, killall -9 vim
pkill이름·사용자·터미널 등 조건pkill -u kim, pkill -9 -t pts/2

같은 시그널은 -9, -KILL, -SIGKILL, -s KILL 어느 표기로도 보낼 수 있다.

PART 4 · 작업 제어와 예약

8. 포그라운드·백그라운드 작업 제어

핵심 필기

명령·키뜻
명령 &백그라운드로 실행 — [작업번호] PID 출력
Ctrl+Z포그라운드 작업을 일시 정지(SIGTSTP)하고 프롬프트로
Ctrl+C포그라운드 작업 종료(SIGINT)
jobs현재 셸의 작업 목록 (-l이면 PID도)
fg %nn번 작업을 포그라운드로
bg %n정지된 n번 작업을 백그라운드에서 계속 실행
kill %nn번 작업에 SIGTERM
%+ / %-현재 작업(가장 최근) / 그 이전 작업 — jobs에서 +, -로 표시
$ sleep 100 &
[1] 1108
$ sleep 200 &
[2] 1109
$ jobs
[1]-  Running                 sleep 100 &
[2]+  Running                 sleep 200 &
$ vi memo.txt            # 편집 중 Ctrl+Z
[3]+  Stopped                 vi memo.txt
$ fg %3                  # 다시 vi 화면으로

nohup — 로그아웃해도 계속 실행

로그아웃하면 셸은 자식들에게 SIGHUP(1)을 보내 함께 종료시킨다. nohup은 SIGHUP을 무시하게 해서 로그아웃 뒤에도 실행을 이어 가게 한다. 터미널 출력은 nohup.out에 쌓인다.

$ nohup ./backup.sh &
[1] 2450
nohup: ignoring input and appending output to 'nohup.out'

9. 작업 예약 — at (한 번)

핵심 필기

at은 정해진 시각에 한 번만 실행한다. atd 데몬이 처리한다.

명령뜻
at 시각예약 입력 시작 — 명령을 입력하고 Ctrl+D로 마침
at -f 파일 시각파일에 적힌 명령을 예약
atq (= at -l)예약 목록
atrm 번호 (= at -d 번호)예약 삭제
batch시스템 부하가 낮을 때 실행

시각 표현 예: at 10:30, at 10:30 pm, at now + 5 minutes, at now + 2 hours, at 9am tomorrow, at midnight, at noon, at 4pm + 3 days.

$ at now + 5 minutes
at> tar czf /backup/home.tgz /home
at> <EOT>                    # Ctrl+D
job 3 at Fri Oct 30 17:40:00 2026
$ atq
3	Fri Oct 30 17:40:00 2026 a root
$ atrm 3

접근 제어: /etc/at.allow가 있으면 그 목록의 사용자만 사용 가능, 없으면 /etc/at.deny에 적힌 사용자만 금지.

10. 작업 예약 — cron (반복)

핵심 필기

cron은 주기적으로 반복하는 작업을 실행한다. crond(데비안 계열은 cron) 데몬이 매분 확인한다.

명령뜻
crontab -e내 crontab 편집
crontab -l내 crontab 내용 출력
crontab -r내 crontab 전체 삭제
crontab -u 사용자 -e(root) 다른 사용자의 crontab 편집
crontab 파일파일 내용을 crontab으로 등록

crontab 한 줄의 필드 — 6개

분 · 시 · 일 · 월 · 요일 · 명령

필드범위
분(minute)0–59
시(hour)0–23
일(day of month)1–31
월(month)1–12 (또는 jan…dec)
요일(day of week)0–7 (0과 7이 일요일), 1=월요일 … 6=토요일
명령실행할 명령
기호뜻예
*모든 값시 필드의 * = 매시
,여러 값 나열1,15 = 1일과 15일
-범위1-5 = 월–금
/간격*/10 = 10마다
$ crontab -l
# 분 시 일 월 요일 명령
30 2 * * *     /root/backup.sh              # 매일 02:30
0 9 * * 1-5    /usr/bin/report.sh           # 평일(월–금) 09:00
*/10 * * * *   /usr/local/bin/check.sh      # 10분마다
0 0 1 * *      /usr/sbin/logrotate.sh       # 매월 1일 00:00
0 18 * * 0     /home/kim/weekly.sh          # 매주 일요일 18:00
0 12 1,15 * *  /home/kim/pay.sh             # 매월 1일·15일 12:00

관련 파일

파일뜻
/var/spool/cron/사용자사용자별 crontab 저장 위치(레드햇 계열, 데비안 계열은 /var/spool/cron/crontabs/)
/etc/crontab시스템 crontab — 요일과 명령 사이에 사용자 이름 필드가 하나 더 있음
/etc/cron.d/패키지별 시스템 cron 파일
/etc/cron.hourly, cron.daily, cron.weekly, cron.monthly넣어 두면 주기별로 실행되는 스크립트 디렉터리
/etc/cron.allow, /etc/cron.deny사용 허가·금지 사용자 (allow가 우선)
# /etc/crontab 형식
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# 분 시 일 월 요일 사용자 명령
17 *  *  *  *  root  run-parts /etc/cron.hourly

기출 유형 연습

kill 명령을 시그널 지정 없이 실행했을 때 전달되는 시그널은?

보기를 선택해 주세요.
힌트 1 보기

기본은 "정상 종료 요청"이다. 강제 종료가 아니다.

정답·해설 보기

D. 기본 시그널은 SIGTERM(15). 프로세스가 정리 작업을 하고 끝낼 기회를 준다. 응답하지 않을 때 -9(SIGKILL)를 쓴다.

다음 중 키보드 입력과 시그널의 연결이 옳은 것은?

보기를 선택해 주세요.
힌트 1 보기

Ctrl+C는 인터럽트(INT), Ctrl+Z는 터미널 정지(Terminal SToP).

정답·해설 보기

B. Ctrl+Z는 SIGTSTP(20)로 일시 정지, Ctrl+C는 SIGINT(2)로 종료, Ctrl+\는 SIGQUIT(3).

매월 1일과 15일 새벽 3시 정각에 /root/clean.sh를 실행하는 crontab 설정은?

보기를 선택해 주세요.
힌트 1 보기

필드 순서는 분 · 시 · 일 · 월 · 요일. "1일과 15일"은 나열 기호다.

정답·해설 보기

A. 분 0, 시 3, 일 1,15. B는 0시 3분, C는 1월·15월(존재하지 않음) 매일, D는 1일부터 15일까지 매일이다.

nice와 renice에 대한 설명으로 틀린 것은?

보기를 선택해 주세요.
힌트 1 보기

우선순위를 "높이는" 방향은 관리자 권한이 필요하다.

정답·해설 보기

C. 일반 사용자는 nice 값을 올리기만 할 수 있다. 0 미만(높은 우선순위)으로 바꾸는 것은 root만 가능하다.

자식 프로세스가 종료되었으나 부모 프로세스가 종료 상태를 회수하지 않아 프로세스 테이블에 남아 있는 프로세스는?

보기를 선택해 주세요.
힌트 1 보기

ps에서 상태 Z, <defunct>로 보인다.

정답·해설 보기

C. 좀비 프로세스. 고아는 반대로 부모가 먼저 죽은 살아 있는 자식이다.

사용자가 로그아웃한 뒤에도 ./long_job.sh가 계속 실행되도록 백그라운드로 띄우는 명령은?

보기를 선택해 주세요.
힌트 1 보기

로그아웃 때 오는 시그널(HUP)을 무시하게 하는 명령이다.

정답·해설 보기

B. nohup이 SIGHUP을 무시하게 하고 &가 백그라운드로 보낸다. bg는 이미 정지된 작업 번호를 받는 명령이다.

단원 마무리

장 요약

주제꼭 기억할 것
개념PID·PPID, PID 1 = systemd/init, fork(복제·새 PID) vs exec(덮어쓰기·PID 유지)
상태R 실행, S 잠듦, D 깨울 수 없는 대기, T 정지, Z 좀비
유형데몬(상주, TTY ?), 고아(부모 먼저 종료 → PID 1 입양), 좀비(부모 미회수)
psaux(%CPU·%MEM, x=터미널 없는 것까지), -ef(PPID), -l(PRI·NI)
우선순위NI -20–19, 기본 0, nice 기본 +10, renice는 절댓값 지정, 낮추기는 root만
시그널1 HUP · 2 INT · 9 KILL · 15 TERM(기본) · 18 CONT · 19 STOP · 20 TSTP
작업 제어&, Ctrl+Z, jobs, fg %n, bg %n, nohup … &
예약at(1회, atq·atrm, Ctrl+D), cron(반복, 분 시 일 월 요일 명령, crontab -e -l -r -u)

책을 덮고 꺼내 보기

  • 부모 프로세스의 번호를 라 한다.
  • 무시할 수 없는 강제 종료 시그널은 이다.
  • kill의 기본 시그널은 이다.
  • Ctrl+Z가 보내는 시그널은 이다.
  • 정지된 프로세스를 재개하는 시그널은 다.
  • nice 값의 범위는 까지다.
  • crontab의 필드 순서는 이다.
  • 로그아웃 후에도 실행을 유지하는 명령은 이다.
시험에 나오는 시그널 7개의 번호와 이름은?

1 SIGHUP(연결 끊김·설정 재로드), 2 SIGINT(Ctrl+C), 9 SIGKILL(강제 종료), 15 SIGTERM(kill 기본), 18 SIGCONT(재개), 19 SIGSTOP(정지, 무시 불가), 20 SIGTSTP(Ctrl+Z).

ps aux와 ps -ef의 차이는?

aux는 BSD 스타일로 USER·%CPU·%MEM·VSZ·RSS·STAT을 보여 주고, -ef는 유닉스 스타일로 UID·PID·PPID·C·STIME을 보여 준다. PPID는 -ef 쪽에 있다.

고아 프로세스와 좀비 프로세스의 차이는?

고아는 부모가 먼저 종료되어 PID 1이 입양한 살아 있는 프로세스, 좀비는 이미 종료했지만 부모가 wait로 회수하지 않아 프로세스 테이블에만 남은 프로세스(STAT Z, defunct)다.

nice와 renice의 사용법 차이는?

nice는 새로 실행할 명령의 NI를 현재 값에서 증감(기본 +10), renice는 실행 중인 프로세스(-p PID, -u 사용자, -g 그룹)의 NI를 지정한 값으로 바꾼다. 음수로 낮추는 것은 root만 가능.

kill, killall, pkill은 무엇으로 대상을 고르나?

kill은 PID(또는 %작업번호), killall은 프로세스 이름, pkill은 이름·사용자(-u)·터미널(-t) 같은 조건.

at 관련 명령과 cron 관련 명령은?

at — at 시각(Ctrl+D로 끝), atq(=at -l), atrm(=at -d). cron — crontab -e(편집), -l(목록), -r(삭제), -u 사용자(대상 지정).

/etc/crontab과 사용자 crontab의 형식 차이는?

/etc/crontab은 요일 필드와 명령 사이에 실행할 사용자 이름 필드가 하나 더 있다.

다음으로 갈 기준: 시그널 7개 번호를 쓰고, 예약 문장을 crontab 한 줄로 바꿀 수 있으면 다음 편으로 간다: 8편 · 에디터 vi/vim.

정답과 해설

확인 문제 정답

  1. 고아 프로세스(Orphan).
  2. T는 정지(Stopped), Z는 좀비(Zombie).
  3. fork — 부모를 복제한 새 프로세스가 생겨 새 PID를 받는다. exec는 PID를 유지한 채 실행 내용만 바꾼다.
  4. ps aux — a(모든 사용자), u(사용자 포맷), x(터미널 없는 프로세스 포함).
  5. r — renice. k는 kill.
  6. pkill -9 -u kim (또는 pkill -KILL -u kim).
  7. renice -5 -p 2000 (또는 renice -n -5 -p 2000). 음수로 낮추는 것이므로 root만 실행할 수 있다.
  8. 30 18 * * 1-5 /root/a.sh.
  9. bg %2.
  10. atq, at -l.
오늘도 한 걸음 앞으로.

내용을 이해했다면 학습 완료를 체크해 주세요.

학습 기록은 현재 브라우저에 저장됩니다.
HJS / STUDY한지석