우분투 · 리눅스 입문 — 14편 (중급)

리눅스 프로세스 관리 — ps·top·kill·jobs

"프로그램이 멈췄어요" — 그럴 때 강제로 끄고, 백그라운드로 돌리고, 뭐가 CPU를 잡아먹는지 보는 법. 작업관리자의 명령어 버전입니다.

2026년 5월 13일 · 약 8분 · 26편 입문 시리즈 14편

터미널에 top·ps·kill 명령으로 프로세스를 관리하는 화면 — 리눅스 프로세스 관리를 상징하는 일러스트

11편에서 htop을 깔아 한 번 띄워봤죠("화려한 작업관리자"). 13편에서 vim에서 안 나올 땐 :q!라고 했고요. 그런데 vim보다 더 큰 게 멈췄을 땐? 또는 다운로드 같은 걸 켜두고 다른 일을 하고 싶을 땐? — 그게 이번 주제, 프로세스 관리입니다.

먼저 한 줄 — "프로세스"는 그냥 '지금 실행 중인 프로그램 하나'예요. 각 프로세스엔 번호(PID)가 붙고, 그걸로 "보고(ps·top) / 멈추고(kill) / 백그라운드로 돌리는(&·jobs)" 일을 합니다. 윈도우의 "작업 관리자(Ctrl+Shift+Esc)"가 하는 일을 명령어로 하는 거예요. 26편 입문 시리즈 14편, "중급" 묶음입니다.

준비물 — 우분투 + 터미널. 가상 머신이면 마음 놓고 실험하세요(프로세스를 죽여봐도 OK). 6편(~/linux-practice)·7편(파이프)·11편(htop 설치)을 봤다면 바로 이어집니다.

프로세스가 뭔가 — PID와 상태

프로그램을 실행하면 운영체제가 그 실행 인스턴스에 번호를 매깁니다 — PID(Process ID). 같은 프로그램을 두 번 켜면 PID가 두 개. 프로세스는 또 다른 프로세스를 낳을 수 있어서(부모-자식 관계), 시스템 안엔 프로세스의 나무가 자랍니다(맨 위 PID 1 = systemd, 19편에서).

$ sleep 300 & [1] 12345 ← 'sleep 300'을 백그라운드로 실행. [작업번호] PID 가 떴음 $ echo $$ 3210 ← 지금 이 셸 자신의 PID. $$ 는 "현재 셸"

각 프로세스엔 상태도 있어요 — R(실행 중/대기 중), S(잠자는 중 — 대부분 여기), D(디스크 등 기다리며 못 멈춤), Z(좀비 — 끝났는데 부모가 안 거둬간 것), T(멈춤). 입문 단계에선 "S가 정상이고, 좀비(Z)가 쌓이거나 D가 오래 가면 뭔가 이상" 정도만 알면 됩니다.

누가 돌고 있나 — ps · top · htop

"지금 뭐가 실행 중이지?"를 보는 도구 셋. 상황 따라 골라 씁니다.

$ ps aux ← '모든 사용자의(a) 자세히(u) 데몬 포함(x)' 전체 프로세스 목록. 보통 | grep 으로 거름 $ ps aux | grep firefox ← firefox 든 줄만 (7편 파이프+grep). USER PID %CPU %MEM ... COMMAND 컬럼 $ pgrep -a firefox ← 더 간단히: firefox 의 PID(와 명령줄)만. pkill 의 짝 $ top ← 실시간 모니터 (기본 탑재). CPU·메모리 순으로 갱신. 'q'로 나가기, 'k'로 그 안에서 kill $ htop ← 더 보기 좋은 버전(apt install htop). F9=kill, F6=정렬, 마우스도 됨, q 나가기
언제 뭘: "그 프로그램 PID가 뭐지" = pgrep -a 이름 또는 ps aux | grep 이름. "전체적으로 뭐가 무거운가" = top(어디서나 됨) 또는 htop(설치했으면, 더 편함). 한 줄 요약 = top의 첫 줄(부하 평균 load average — 1·5·15분 평균. CPU 코어 수보다 크면 바쁘다는 뜻).

멈추기 — kill · kill -9 · pkill

멈춘(또는 멈춰야 할) 프로세스를 끄는 법. 핵심은 — kill은 "죽여라"가 아니라 "신호를 보낸다"는 것. 보통 보내는 신호가 TERM("정리하고 끝내"), 강한 게 KILL("당장 죽어 — 정리도 못 함").

$ kill 12345 ← PID 12345 에게 TERM 신호. "정상 종료해 줘" — 대부분 이걸로 충분 (먼저 이걸로!) $ kill -9 12345 ← 안 죽으면 KILL(-9). 강제 종료. 데이터 정리 못 하니 '먹통일 때 최후 수단'으로만 $ pkill firefox ← 이름으로 죽이기 (PID 안 찾고). pkill -9 firefox 로 강제도 가능. 이름 정확히 — 오타 주의 $ killall firefox ← 그 이름의 프로세스 전부. pkill 과 비슷 (정확 일치) $ kill -l ← 보낼 수 있는 신호 목록 (TERM=15, KILL=9, HUP=1, INT=2=Ctrl+C 가 보내는 것 ...)
⚠️ 순서를 지키세요: 먼저 kill PID(=TERM) → 몇 초 기다려도 안 죽으면 그때 kill -9 PID. -9를 먼저·습관적으로 쓰면 프로그램이 임시 파일·DB 등을 정리 못 한 채 죽어 데이터가 망가질 수 있습니다. 그리고 PID 1(systemd)은 절대 kill 하지 마세요 — 시스템이 멈춥니다. 모르는 PID·시스템 프로세스(USER가 root인 것들)는 함부로 건드리지 말 것. 내가 실행한 프로그램만.

백그라운드 작업 — & · jobs · fg · nohup

"이거 켜두고 다른 일 하고 싶다" — 다운로드, 빌드, 오래 걸리는 스크립트 등. 셸 안에서 작업을 앞/뒤로 옮기는 법:

$ long-command & ← 끝에 & 붙이면 백그라운드로 실행, 셸은 바로 다음 명령 받음. [작업번호] PID 출력 $ jobs [1]+ Running long-command & ← 이 셸에서 백그라운드로 도는 작업 목록 $ fg %1 ← 작업 1 을 다시 '앞'으로(foreground). 화면 차지하며 진행. (그냥 fg 면 최근 것) (앞에서 실행 중일 때) Ctrl+Z ← 그 작업을 '멈춤(T)' 상태로 + 셸 복귀. 이어서 bg 하면 백그라운드로 재개 $ bg %1 ← 멈춰둔 작업 1 을 백그라운드에서 재개 $ nohup long-command & ← nohup: 터미널을 닫아도 안 죽음 (출력은 nohup.out 파일로). 원격(SSH) 작업에 자주 $ disown %1 ← 이미 & 로 돌린 작업을 셸과 분리 (터미널 닫아도 살아있게). nohup 의 사후 버전

요약: 끝에 &(백그라운드 실행), Ctrl+Z(앞 작업 멈춤) → bg(백으로 재개) / fg(앞으로), jobs(목록), 터미널 닫아도 살리려면 nohup ... & 또는 disown. (서버에서 길게 도는 작업은 tmux/screen이라는 도구가 더 편한데, 그건 시리즈 범위 밖 — 키워드만.)

오늘의 정리: 프로세스 = 실행 중인 프로그램, 번호 = PID. 보기: ps aux | grep 이름·pgrep -a 이름·top·htop(q로 나감). 멈추기: kill PID(=TERM, 먼저) → 안 되면 kill -9 PID(KILL, 최후)·pkill 이름·killall 이름. PID 1·시스템 프로세스 건드리지 말 것. 백그라운드: 명령 &·Ctrl+Zbg/fg·jobs·nohup 명령 &·disown.

시리즈 흐름

  1. 1~12편 입문·기초 ✔   13편 vim 기초 ✔ (중급 시작)
  2. 14편 — 프로세스 관리 (이 글) ✔
  3. 15편 — 디스크 관리 (df·du·lsblk — "용량 부족" 원인 찾기)
  4. 16편~ — 네트워크 명령어 / ufw 방화벽 / SSH 키 / systemd 서비스 / cron …

오늘 할 일: sleep 200 & 로 백그라운드 작업 하나 만들고 → jobsfg(앞으로) → Ctrl+Z(멈춤) → bg(재개) → kill %1(끝내기) 한 바퀴. 그리고 top 한 번 띄워서 'q'로 나오기. 백그라운드/포그라운드 전환이 손에 들어오면 됩니다. 15편에서 만나요. (신호·작업 제어 전체는 man kill·man bash의 JOB CONTROL 절, 또는 우분투 서버 문서.)

우분투·리눅스 입문 시리즈

이제 멈춘 프로그램이 안 무섭습니다. 15편 "리눅스 디스크 관리"로 이어집니다.

다음 편은 JUNAI 블로그에서 이어 보세요.

© 2026 JUNAI · 우분투·리눅스 입문 시리즈 14편 · 본 글은 2026년 5월 13일 기준으로 작성되었습니다.

© 2026 주나이테크(주) @JUNAITECH