자격증 정복/리눅스마스터

리눅스마스터 2급 필기 10 — 프로세스 관리 (ps·top·jobs·nice·kill·cron) [2차 1과목 리눅스 운영 및 관리]

올드 IT직장인 2026. 10. 9. 23:57

리눅스마스터 2급 필기 10 — 프로세스 관리 (ps·top·jobs·nice·kill·cron) [2차 1과목 리눅스 운영 및 관리]

출제기준 2차 1과목: 리눅스 운영 및 관리 — 프로세스 관리
기출 빈도 2위(약 10%) 단원입니다.
ps/top, nice/renice, 시그널 번호, kill/killall, crontab 필드 순서는 매번 나온다고 봐도 됩니다!


프로세스의 기본 용어 ⭐⭐⭐⭐

운영체제에서 실행 중인 모든 프로그램이 프로세스(Process)입니다.

모든 프로세스는 생성될 때 주민번호 같은 고유 번호 PID를 받고, 관리자는 PID로 자원 점유를 감시하거나 비정상 프로세스를 종료합니다.

용어 내용
프로그램 보조 기억 장치(디스크)에 저장된 실행 가능한 파일
프로세스 프로그램을 실행한 상태(메모리에 올라가 동작 중)
작업(Job) 사용자가 터미널에서 실행시킨 프로세스의 단위
PID 프로세스 고유 식별 번호 (리눅스는 이름이 아닌 숫자로 관리)
PPID 이 프로세스를 만든 부모 프로세스의 ID
PID 1 부팅 후 커널이 가장 먼저 생성하는 최초 프로세스 (systemd / 구버전 init)

 

비유하면 프로그램은 '요리 레시피(책)', 프로세스는 '그 레시피로 실제 요리하는 중인 상태'입니다.

같은 프로그램을 두 번 실행하면 프로세스는 2개(PID 서로 다름)입니다.

 

PID 1(systemd) → 터미널 → 셸(PID 1234) → 편집기(PID 5678, PPID 1234)
                                       → 컴파일러(PID 5679, PPID 1234)

 

⭐ "프로세스를 관리하기 위한 고유 식별 번호는?" → PID
⭐ "부팅 시 커널이 (가) 라는 최초 프로세스를 발생시키고 PID (나) 을 부여" → (가) systemd, (나) 1

 

💡 RHEL 7 이상은 PID 1이 systemd, 그 이전(RHEL 6 등)은 init입니다.

현재 셸의 PID는 echo $$, 부모 PID는 echo $PPID로 확인합니다.

pstree로 init(systemd)이 모든 프로세스의 부모임을 확인할 수 있고, init의 PID는 0이 아니라 1입니다.


프로세스 생성 과정 — fork와 exec ⭐⭐⭐⭐

단계 내용
fork() 부모(Parent) 프로세스가 자신과 똑같은 복사본의 자식(Child) 프로세스를 만듦
exec() 복제된 자식의 메모리 공간에 새로운 프로그램 코드를 덮어씌워 실행
부모 → fork() → 자식(부모와 동일한 복사본) → exec() → 새로운 프로그램으로 교체되어 실행

 

셸에서 ls를 입력하면 셸이 fork로 자식을 만들고, 그 자식이 exec로 /bin/ls 코드로 바뀌어 실행되며, 부모(셸)는 자식이 끝나길 기다립니다(wait). 그래서 명령 실행은 fork + exec 조합입니다.

 

⭐ "부모가 자신과 똑같은 복사본의 자식을 만드는 기법은?" → fork


프로세스 유형 ⭐⭐⭐⭐

유형 특징
포그라운드 사용자 입력을 받고 결과를 즉시 출력, 터미널을 점유해 끝날 때까지 다른 명령 불가
Ctrl+C로 강제 종료
백그라운드 사용자 입력 없이 실행, 터미널 미점유, 명령어 뒤에 &
데몬(Daemon) 부팅 시 실행되어 메모리에 상주하며 요청을 기다리는 서비스 프로세스
이름이 d로 끝남(sshd, httpd, crond), 터미널과 무관하게 생존
특징 포그라운드 백그라운드 데몬
사용자 개입 필수 불필요 불필요
터미널 점유 점유 미점유 미점유
실행 시점 사용자 명령 입력 사용자와 함께 부팅·서비스 시작 시
주 목적 즉각 작업 장기 작업 병렬 처리 상시 서비스 제공

 

⭐ "명령어를 백그라운드로 실행하기 위해 맨 마지막에 붙이는 기호는?" → &

 

데몬의 실행 방식 — Standalone vs xinetd ⭐⭐⭐⭐ (빈출)

구분 Standalone(독립 실행) xinetd(슈퍼 데몬)
원리 메모리에 상주하며 요청 대기 부팅 시 xinetd만 실행, 요청이 오면 해당 데몬 호출
장점 응답 속도 빠름 시스템 자원(메모리) 효율적
단점 서비스가 없어도 자원 계속 소모 요청 시 프로세스를 새로 만들어 상대적으로 느림
적합 접속이 많은 서비스(웹 등) 가끔 쓰는 서비스(telnet, ftp 등)

 

⭐ "standalone과 xinetd 비교로 알맞은 것은?" → xinetd가 standalone보다 메모리 관리가 더 효율적이다.

(xinetd가 빠르다, 빈번한 요청에 적합하다 같은 보기는 반대로 서술된 오답)

 

💡 RHEL 7 이후에는 xinetd가 기본 설치에서 빠지고 systemd의 소켓 활성화가 같은 역할을 대신합니다.

xinetd는 TCP Wrapper 연계로 접근 통제도 제공해서 보안 쪽에서도 자주 언급됩니다.


비정상 프로세스 — 고아와 좀비 ⭐⭐⭐⭐⭐

구분 고아 프로세스(Orphan) 좀비 프로세스(Zombie)
상태 실행 중 종료됨
상황 부모가 먼저 종료됨 자식이 종료됐는데 부모가 종료 상태를 회수하지 않음
처리 PID 1(systemd)이 입양해 새 부모가 됨 원래 부모가 방치
상태 코드 S 등 정상 Z (defunct)
위험성 낮음 높음 (PID 자원 낭비)
해결책 필요 시 직접 종료 부모 프로세스를 종료

 

⭐ "자식은 이미 종료되었는데 부모가 방치해 PID를 낭비하는 상태는?" → 좀비 프로세스

 

💡 좀비는 이미 죽은 상태라 kill -9로도 죽지 않습니다.

부모가 wait()를 호출하지 않아 프로세스 테이블 항목만 남은 것이므로, 부모를 종료하면 PID 1이 입양해 정리합니다.


프로세스 확인 — ps ⭐⭐⭐⭐⭐

ps(Process Status)는 실행 시점의 정보를 정적으로 보여 주는 스냅샷입니다.

실시간 변화를 보여 주는 top과 다릅니다.

출력 필드

필드 의미
USER 프로세스 소유자
PID / PPID 프로세스 ID / 부모 PID
%CPU / %MEM CPU / 메모리 사용률
TTY 연결된 터미널 (없으면 ?)
STAT 프로세스 상태
START 시작 시간
TIME CPU 누적 사용 시간
CMD / COMMAND 실행된 명령

 

주요 옵션

옵션 설명
-e 시스템 전체 프로세스
-f 풀 리스트(UID, PID, PPID, STIME, CMD)
-l 상세 정보(F, S, UID, PID, PPID, C, PRI, NI, ADDR, SZ, WCHAN …)
-a 터미널이 있는 타 사용자의 프로세스
-x 터미널이 없는 프로세스
-u 사용자 특정 사용자의 프로세스
-p PID 특정 PID의 프로세스
-C 명령 특정 실행 이름의 프로세스

 

프로세스 상태 코드 (STAT) ⭐⭐⭐⭐

코드 의미
R Running — 실행 중
S Sleeping — 이벤트·신호 대기
D Uninterruptible Sleep — 신호에 반응하지 않음
T Stopped — 정지
Z Zombie — 종료됐으나 부모가 자원 미회수

 

⭐ "백그라운드로 실행시킨 프로세스의 우선순위(NI/PRI) 값을 확인하려면?" → ps -l (jobs -p/-l, ps aux는 기본 출력에 NI/PRI가 없음)
⭐ "실행 중인 모든 프로세스를 확인하는 명령은?" → ps aux (또는 ps -ef)

 

💡 ps에는 UNIX 방식(ps -ef, 하이픈 있음)과 BSD 방식(ps aux, 하이픈 없음)이 있고 실무에서는 이 두 가지를 주로 씁니다. -ef는 PPID가 보여 부모-자식 관계 파악에 좋고, aux는 %CPU·%MEM·VSZ·RSS가 보입니다. STAT에 붙는 s(세션 리더), +(포그라운드 그룹), <(높은 우선순위), N(낮은 우선순위)도 알아 두세요. 특정 프로세스 찾기 관용구는 ps -ef | grep sshd, pgrep sshd입니다.

 

pstree — 트리 구조 ⭐⭐⭐

부모-자식 계층 구조를 트리로 보여 줍니다.

옵션 설명
-p PID 함께 표시
-u 소유자가 바뀐 경우 사용자 표시
-h 현재 프로세스와 부모 강조
-n PID 순 정렬(기본은 이름순)
-a 실행 인자·옵션까지 표시

실시간 모니터링 — top ⭐⭐⭐⭐⭐

프로세스 상태와 CPU·메모리 사용량을 실시간(기본 3초 주기)으로 보여 줍니다. 윈도우 작업 관리자와 가장 비슷합니다.

필드 의미
PID / USER 프로세스 ID / 소유자
PR / NI 시스템 배정 우선순위 / 사용자 조정값
VIRT 확보한 가상 메모리 전체 크기
RES 실제로 RAM에 적재되어 사용 중인 물리 메모리
S 상태 (R / S / Z)
%CPU / %MEM 자원 점유율
옵션 의미
-d 초 화면 갱신 주기
-p PID 특정 PID만 모니터링
-u 사용자 특정 사용자의 프로세스만
-n 횟수 지정 횟수만큼 갱신 후 자동 종료

 

top 실행 중 명령키: q 종료, k 프로세스 종료, r renice, M 메모리순 정렬, P CPU순 정렬, h 도움말.

 

상단 요약에는 up 26 min, 2 users, load average: 0.06, 0.17, 0.14, Tasks: 179 total, 1 running, 178 sleeping, 0 stopped, 0 zombie, %Cpu(s), MiB Mem, MiB Swap이 표시됩니다. us/sy/ni/id/wa는 사용자/시스템/nice/유휴/입출력 대기 CPU 비율입니다.

 

⭐ "실시간으로 프로세스 상태·CPU·메모리 점유율을 모니터링하는 명령은?" → top
⭐ "실제 RAM에 적재되어 사용 중인 물리 메모리 크기 필드는?" → RES (VIRT는 가상 메모리 전체, NI는 nice 값)


작업 제어 — jobs, fg, bg ⭐⭐⭐⭐⭐

jobs는 현재 셸 세션에서 백그라운드로 실행 중이거나 일시 중단된 작업만 보여 줍니다.

시스템 전체를 보는 ps와 다릅니다.

[1]-  Running  sleep 500 &
[2]+  Running  sleep 600 &
표시 의미
+ 현재 작업 — fg/bg를 옵션 없이 입력했을 때 기본 선택되는 작업
- 이전 작업 — 현재 작업(+)이 끝나면 다음에 +가 될 작업
jobs 옵션 의미
-l 작업 번호와 PID까지
-p PID만
-r 실행 중(Running) 작업만
-s 일시 중단(Stopped) 작업만
-n 마지막 통지 이후 상태가 바뀐 작업만

 

상태 정보: Running / Stopped(Ctrl+Z 등) / Done(정상 완료) / Terminated(kill 등) / Exit(종료 코드 반환)

 

fg와 bg

구분 fg bg
동작 백그라운드·중단 작업을 포그라운드로 중단된 작업을 백그라운드 실행으로
터미널 끝날 때까지 다른 명령 불가 작업 중에도 다른 명령 가능
주 대상 vi, top 같은 대화형 프로그램 find, cp, tar 같은 데이터 처리 작업
사용법 fg, fg %1 bg, bg %1
작업 실행 → Ctrl+Z (Stopped) → fg %1 (전면 복귀)
                              → bg %1 (후면에서 계속 Running)
  • Ctrl+C = 작업 종료(SIGINT), Ctrl+Z = 일시 정지(SIGTSTP)
  • jobs·fg·bg는 셸 내장 명령이라 현재 셸 세션 안에서만 유효합니다.

⭐ "jobs 출력에서 번호 옆의 + 가 의미하는 것은?" → fg나 bg를 옵션 없이 입력할 때 기본으로 선택되는 작업(현재 작업)


우선순위 조정 — nice, renice ⭐⭐⭐⭐⭐

nice — 실행할 때 우선순위 지정

  • NI 값은 -20 ~ 19, 값이 작을수록 우선순위가 높습니다(반비례).
  • 기본 NI는 0.
  • 문법: nice -n NI값 명령어 (옵션 없이 nice만 쓰면 기존 값에 +10)
  • 일반 사용자는 0~19(우선순위를 낮추는 방향)만, root는 -20~19 전체 가능
nice -n 19 yes > /dev/null &      → ps -l 에서 NI 19, PRI 99

 

renice — 실행 중인 프로세스의 NI 변경

옵션 대상 예
-p 특정 PID renice 10 -p 1234
-u 특정 사용자의 모든 프로세스 renice 5 -u student
-g 특정 그룹의 모든 프로세스 renice 7 -g developers

 

renice는 지정한 값으로 갱신합니다(누적 아님). NI가 5인 프로세스에 renice 10을 하면 15가 아니라 10이 됩니다.

 

구분 nice renice
적용 시점 프로세스 실행 시 실행 도중
대상 지정 명령어 이름 PID / 사용자 / 그룹
문법 -n 옵션 NI 값을 옵션 없이 직접 입력
용도 초기 자원 배분 부하 발생 시 긴급 대응

 

PRI vs NI ⭐⭐⭐⭐

  • PRI(Priority): 커널이 실제로 참고하는 우선순위
  • NI(Nice): 사용자가 조정하는 '친절도'이며 PRI에 반영됨
  • ps -l에서 기본 PRI 80, NI 19면 PRI 99 → NI가 클수록 PRI도 커지고, 우선순위는 낮아집니다.

⭐ "특정 사용자(student) 소유의 모든 프로세스의 우선순위를 한 번에 변경하려면?" → renice ... -u student
⭐ "(가) 커널이 실제로 참고하는 항목, (나) 사용자가 변경해 (가)에 반영되는 항목" → (가) PRI, (나) NI

 

💡 최신 renice 문법은 renice -n 10 -p 1234이고 교재의 구 문법도 동작합니다.

일반 사용자는 NI를 올리기만 할 수 있고 한 번 올린 값을 다시 내릴 수는 없습니다(root만 가능).


로그아웃해도 유지 — nohup ⭐⭐⭐

No Hangup의 약자로, 터미널 접속을 끊어도 프로세스가 중단되지 않게 합니다.

셸이 보내는 종료 신호 SIGHUP을 무시합니다.

  • 출력 방향을 지정하지 않으면 nohup.out 파일에 자동 기록
  • 세션 종료 후에도 유지하려면 & 로 백그라운드 구동이 필수
nohup 명령어 &
nohup sh -c 'while true; do date; sleep 1; done' > my_time_log 2>&1 &

2>&1은 표준 오류(2)를 표준 출력(1)과 같은 곳으로 보내라는 뜻입니다.

원격(ssh) 작업에서는 nohup 외에 screen, tmux 같은 멀티플렉서도 많이 씁니다.


시그널과 프로세스 종료 — kill, killall ⭐⭐⭐⭐⭐

시그널은 프로세스에 이벤트를 알리거나 제어하기 위해 보내는 신호입니다.

주요 시그널 (번호까지 암기!)

번호 이름 의미
1 SIGHUP 재시작 / 설정 파일 다시 읽기
2 SIGINT 인터럽트 (Ctrl+C)
9 SIGKILL 강제 종료 (무시·차단 불가)
15 SIGTERM 정상 종료 (기본 시그널)
18 SIGCONT Stopped 프로세스 재개
19 SIGSTOP 일시 중단

 

시그널 전체 목록은 kill -l로 봅니다.

 

💡 SIGTERM(15)은 프로세스가 정리 작업을 하고 끝낼 기회를 주므로 먼저 15를 시도하고 안 될 때 9를 쓰는 것이 관례입니다. Ctrl+Z는 정확히는 SIGTSTP(20)이고, SIGSTOP(19)·SIGKILL(9)은 프로세스가 잡거나 무시할 수 없습니다. kill -HUP PID로 sshd, httpd 같은 데몬이 설정을 다시 읽게 하면 서비스 무중단 재적용이 가능합니다.

 

kill vs killall

구분 kill killall
구분 kill killall
지정 대상 PID(번호) 프로세스 이름
범위 특정 단일 프로세스 동일 이름의 모든 프로세스
안전성 높음(정밀 타격) 낮음(엉뚱한 프로세스까지 죽을 수 있음)
기본 시그널 15 15
ps -ef | grep sleep       (PID 확인)
kill -9 831               (강제 종료)
killall -9 sh             (sh 이름의 모든 프로세스 종료)

kill -9, kill -KILL, kill -SIGKILL은 모두 같은 의미입니다. 관련 도구로 pkill 패턴, pgrep이 있습니다.

 

⭐ "kill과 killall에 대한 설명으로 알맞은 것은?" → kill은 단일 프로세스를 정밀하게, killall은 동일 이름의 모든 프로세스를 제어한다


작업 예약 — cron, crontab ⭐⭐⭐⭐⭐ (필드 순서 단골)

정해진 시간·주기에 맞춰 작업을 자동 실행하는 서비스(데몬)가 crond, 작업 목록 파일을 crontab이라고 합니다.

crontab 옵션

옵션 의미
-e Edit — 작성·수정
-l List — 등록된 예약 작업 출력
-r Remove — 등록된 모든 예약 작업 삭제
-u User — 특정 사용자의 crontab 제어 (root만)

 

시간 필드 — "분시일월요"

분   시   일   월   요일   명령어
0-59 0-23 1-31 1-12 0-7    /home/test.sh
  • 요일은 0과 7이 모두 일요일, 16이 월토
문자 설명 예시
* 모든 값 월 자리의 * = 매월
- 범위 요일 자리 1-5 = 월~금
, 복수 지정 시 자리 9,18 = 오전 9시와 오후 6시
/ 주기 지정 분 자리 */10 = 10분마다

 

작성 예시

목적 crontab 항목
매일 새벽 3시에 backup.sh 00 03 * * * /home/admin/scripts/backup.sh
평일(월~금) 오전 9시마다 notify.py 00 09 * * 1-5 /usr/bin/python3 /home/admin/notify.py
15분마다 디스크 용량 기록 */15 * * * * /bin/df -h > /tmp/df.log
월~금 오전 9시·오후 6시에 sync.sh 00 09,18 * * 1-5 /home/user/sync.sh

 

⭐ "crontab 시간 필드에서 슬래시(/)의 의미는?" → 작업의 주기를 지정 (*/10 = 10분마다)
⭐ "요일 필드에서 0과 7이 공통으로 의미하는 요일은?" → 일요일
⭐ "등록된 모든 예약 작업을 삭제하는 옵션은?" → -r
⭐ "ihduser의 cron 설정 과정 crontab ( )의 괄호는?" → -e (관리자는 crontab -u 사용자 -e)

💡 사용자별 crontab은 /var/spool/cron/사용자명에 저장됩니다. 시스템 전역은 /etc/crontab(이 파일은 명령 앞에 사용자명 필드가 추가됨), /etc/cron.d/, 그리고 /etc/cron.hourly·daily·weekly·monthly 디렉터리로 관리합니다. 접근 제어는 /etc/cron.allow(허용)·/etc/cron.deny(거부)이고, 일회성 예약은 at 명령입니다. 그리고 crontab -r은 확인 없이 전체 삭제하므로 crontab -l > backup.txt로 먼저 백업하세요.


기출 문제 Q&A

Q. 프로세스를 관리하기 위해 각 프로세스에 부여되는 고유 식별 번호는?

A. PID입니다.

 

Q. 부모 프로세스가 자신과 똑같은 복사본의 자식 프로세스를 만드는 기법은?

A. fork입니다. exec는 복제된 공간에 새 프로그램 코드를 덮어씌워 실행하는 것입니다.

 

Q. standalone 방식과 xinetd 방식의 비교로 알맞은 것은?

A. xinetd가 standalone보다 메모리 관리가 더 효율적입니다. 반면 응답 속도는 standalone이 더 빠릅니다.

 

Q. 자식은 종료되었는데 부모가 종료 상태를 회수하지 않아 PID를 낭비하는 프로세스는?

A. 좀비 프로세스입니다. 부모를 종료하면 정리됩니다.

 

Q. 백그라운드로 실행시킨 프로세스의 우선순위(PRI/NI)를 확인하는 명령은?

A. ps -l입니다.

 

Q. 실행 중인 모든 프로세스를 확인하는 명령 옵션은?

A. aux(또는 -ef)입니다.

 

Q. top에서 실제 RAM에 적재되어 사용 중인 물리 메모리 크기를 나타내는 필드는?

A. RES입니다. VIRT는 가상 메모리 전체 크기입니다.

 

Q. jobs 출력에서 번호 옆의 '+' 표시의 의미는?

A. fg나 bg 명령을 옵션 없이 입력했을 때 기본으로 선택되는 현재 작업입니다.

 

Q. 특정 사용자 소유의 모든 프로세스 우선순위를 한 번에 바꾸는 renice 옵션은?

A. -u입니다.

 

Q. 커널이 실제로 참고하는 우선순위 항목과 사용자가 조정해 그것에 반영되는 항목은?

A. PRI와 NI입니다.

 

Q. 프로세스를 정상 종료시키는 시그널과 강제 종료시키는 시그널의 번호는?

A. 정상 종료 15 (SIGTERM), 강제 종료 9 (SIGKILL)입니다.

 

Q. kill과 killall의 설명으로 알맞은 것은?

A. kill은 PID로 단일 프로세스를, killall은 이름으로 동일 이름의 모든 프로세스를 제어합니다.

 

Q. crontab 시간 필드에서 슬래시(/)의 의미와, 요일 필드에서 0과 7이 뜻하는 요일은?

A. 슬래시는 주기 지정, 0과 7은 모두 일요일입니다.

 

Q. 등록된 모든 crontab 예약 작업을 삭제하는 옵션은?

A. -r입니다.


💡 실무에서는?

서버가 느려졌다는 연락을 받으면 저는 항상 top부터 엽니다.

P로 CPU순, M으로 메모리순 정렬해서 범인을 잡고, Tasks 줄의 zombie 수와 load average를 같이 봅니다.

범인이 배치 작업이면 renice로 우선순위를 낮춰 서비스부터 살리고, 정말 멈춘 프로세스면 kill(15)로 먼저 종료를 시도하고 안 될 때만 kill -9를 씁니다. killall은 이름이 같은 프로세스를 전부 죽이기 때문에 운영 서버에서는 PID 확인 없이 쓰지 않는 게 철칙이에요.

 

그리고 cron은 정보보안 관점에서도 중요합니다.

침해 사고 조사 때는 공격자가 지속성 확보용으로 등록한 예약 작업이 있는지 /var/spool/cron과 /etc/cron.*부터 확인합니다.


핵심 정리

✅ 프로그램(파일) vs 프로세스(실행 중), PID / PPID, PID 1 = systemd(init)
✅ fork(복제) + exec(덮어쓰기) = 명령 실행
✅ 포그라운드 / 백그라운드(&) / 데몬(d로 끝남, 상주)
✅ standalone(빠름, 자원 소모) vs xinetd(효율적, 느림)
✅ 고아(부모 먼저 종료, PID 1이 입양) vs 좀비(자식 종료, 부모 방치, Z, 부모 종료로 해결)
✅ ps -ef / aux / -l(PRI·NI), STAT R S D T Z, pstree -p
✅ top: -d -p -u -n, RES(물리 메모리) vs VIRT(가상 메모리)
✅ jobs(+ 현재 작업) / Ctrl+Z → bg·fg / Ctrl+C
✅ nice -n(-20~19, 작을수록 높음, 기본 0) / renice -p -u -g / PRI vs NI
✅ nohup = SIGHUP 무시, nohup.out
✅ 시그널 1 HUP / 2 INT / 9 KILL / 15 TERM / 18 CONT / 19 STOP, kill -l
✅ kill(PID, 정밀) vs killall(이름, 일괄)
✅ crontab -e -l -r -u, 분·시·일·월·요일, * - , /, 요일 0=7=일요일

 

다음 편에서는 에디터(vi, nano, emacs 등)를 다룹니다!

 

궁금한 점은 댓글로 남겨주세요!

반응형
개인정보처리방침  |  블로그 소개