리눅스 프로세스 관리 — ps·top·kill·jobs
"프로그램이 멈췄어요" — 그럴 때 강제로 끄고, 백그라운드로 돌리고, 뭐가 CPU를 잡아먹는지 보는 법. 작업관리자의 명령어 버전입니다.
11편에서 htop을 깔아 한 번 띄워봤죠("화려한 작업관리자"). 13편에서 vim에서 안 나올 땐 :q!라고 했고요. 그런데 vim보다 더 큰 게 멈췄을 땐? 또는 다운로드 같은 걸 켜두고 다른 일을 하고 싶을 땐? — 그게 이번 주제, 프로세스 관리입니다.
먼저 한 줄 — "프로세스"는 그냥 '지금 실행 중인 프로그램 하나'예요. 각 프로세스엔 번호(PID)가 붙고, 그걸로 "보고(ps·top) / 멈추고(kill) / 백그라운드로 돌리는(&·jobs)" 일을 합니다. 윈도우의 "작업 관리자(Ctrl+Shift+Esc)"가 하는 일을 명령어로 하는 거예요. 26편 입문 시리즈 14편, "중급" 묶음입니다.
~/linux-practice)·7편(파이프)·11편(htop 설치)을 봤다면 바로 이어집니다.
프로세스가 뭔가 — PID와 상태
프로그램을 실행하면 운영체제가 그 실행 인스턴스에 번호를 매깁니다 — PID(Process ID). 같은 프로그램을 두 번 켜면 PID가 두 개. 프로세스는 또 다른 프로세스를 낳을 수 있어서(부모-자식 관계), 시스템 안엔 프로세스의 나무가 자랍니다(맨 위 PID 1 = systemd, 19편에서).
각 프로세스엔 상태도 있어요 — R(실행 중/대기 중), S(잠자는 중 — 대부분 여기), D(디스크 등 기다리며 못 멈춤), Z(좀비 — 끝났는데 부모가 안 거둬간 것), T(멈춤). 입문 단계에선 "S가 정상이고, 좀비(Z)가 쌓이거나 D가 오래 가면 뭔가 이상" 정도만 알면 됩니다.
누가 돌고 있나 — ps · top · htop
"지금 뭐가 실행 중이지?"를 보는 도구 셋. 상황 따라 골라 씁니다.
pgrep -a 이름 또는 ps aux | grep 이름. "전체적으로 뭐가 무거운가" = top(어디서나 됨) 또는 htop(설치했으면, 더 편함). 한 줄 요약 = top의 첫 줄(부하 평균 load average — 1·5·15분 평균. CPU 코어 수보다 크면 바쁘다는 뜻).멈추기 — kill · kill -9 · pkill
멈춘(또는 멈춰야 할) 프로세스를 끄는 법. 핵심은 — kill은 "죽여라"가 아니라 "신호를 보낸다"는 것. 보통 보내는 신호가 TERM("정리하고 끝내"), 강한 게 KILL("당장 죽어 — 정리도 못 함").
kill PID(=TERM) → 몇 초 기다려도 안 죽으면 그때 kill -9 PID. -9를 먼저·습관적으로 쓰면 프로그램이 임시 파일·DB 등을 정리 못 한 채 죽어 데이터가 망가질 수 있습니다. 그리고 PID 1(systemd)은 절대 kill 하지 마세요 — 시스템이 멈춥니다. 모르는 PID·시스템 프로세스(USER가 root인 것들)는 함부로 건드리지 말 것. 내가 실행한 프로그램만.백그라운드 작업 — & · jobs · fg · nohup
"이거 켜두고 다른 일 하고 싶다" — 다운로드, 빌드, 오래 걸리는 스크립트 등. 셸 안에서 작업을 앞/뒤로 옮기는 법:
요약: 끝에 &(백그라운드 실행), Ctrl+Z(앞 작업 멈춤) → bg(백으로 재개) / fg(앞으로), jobs(목록), 터미널 닫아도 살리려면 nohup ... & 또는 disown. (서버에서 길게 도는 작업은 tmux/screen이라는 도구가 더 편한데, 그건 시리즈 범위 밖 — 키워드만.)
ps aux | grep 이름·pgrep -a 이름·top·htop(q로 나감). 멈추기: kill PID(=TERM, 먼저) → 안 되면 kill -9 PID(KILL, 최후)·pkill 이름·killall 이름. PID 1·시스템 프로세스 건드리지 말 것. 백그라운드: 명령 &·Ctrl+Z→bg/fg·jobs·nohup 명령 &·disown.시리즈 흐름
- 1~12편 입문·기초 ✔ 13편 vim 기초 ✔ (중급 시작)
- 14편 — 프로세스 관리 (이 글) ✔
- 15편 — 디스크 관리 (
df·du·lsblk— "용량 부족" 원인 찾기) - 16편~ — 네트워크 명령어 / ufw 방화벽 / SSH 키 / systemd 서비스 / cron …
오늘 할 일: sleep 200 & 로 백그라운드 작업 하나 만들고 → jobs → fg(앞으로) → Ctrl+Z(멈춤) → bg(재개) → kill %1(끝내기) 한 바퀴. 그리고 top 한 번 띄워서 'q'로 나오기. 백그라운드/포그라운드 전환이 손에 들어오면 됩니다. 15편에서 만나요. (신호·작업 제어 전체는 man kill·man bash의 JOB CONTROL 절, 또는 우분투 서버 문서.)