Linux 강좌 / 프로세스 확인·일시정지·종료하기

리눅스에서 프로세스를 관리할 때는 실행 중인 대상을 확인하고, 상태와 자원 사용량을 살펴본 뒤, 필요한 경우에만 신호를 보내 중지하거나 종료합니다. ps는 시점별 목록을, top은 갱신되는 화면을 보여 줍니다. 종료할 때는 먼저 정상 종료를 요청하는 TERM을 사용하고, 강제 종료 KILL은 마지막 수단으로 남겨 두세요.

프로세스와 셸 작업을 구분하기

프로세스는 실행 중인 프로그램의 인스턴스이며 PID(프로세스 ID)로 식별합니다. PPID(부모 프로세스 ID)는 이를 만든 부모를 가리킵니다. 하나의 셸에서 시작한 작업(job)은 셸이 관리하는 실행 단위로, 한 작업에 여러 프로세스가 포함될 수도 있습니다. %1 같은 작업 번호는 그 셸의 작업 제어에서 쓰이고, 시스템 전체에서 쓰이는 PID와 같지 않습니다.

서비스가 실행하는 프로세스도 있지만, 모든 프로세스가 서비스는 아닙니다. 데몬이 관리하는 서비스를 재시작하려면 프로세스 하나를 임의로 죽이기 전에 서비스 관리자의 상태와 로그를 확인해야 합니다. 이 강좌는 일반 사용자가 자신의 실습 프로세스를 확인·제어하는 데 집중합니다.

ps로 필요한 열만 골라 확인하기

ps는 명령을 실행한 순간의 프로세스 목록을 출력합니다. 전체 시스템을 볼 때는 원하는 열을 명시하면 PID·부모·사용자·상태·실행 시간·명령을 한눈에 비교할 수 있습니다. 출력이 길 수 있으므로 필요한 대상이 있다면 PID나 명령 이름으로 범위를 좁히세요.

ps -eo pid,ppid,user,stat,etime,args
ps -eo pid,ppid,user,%cpu,%mem,stat,args --sort=-%cpu | head

두 번째 예는 %CPU 기준으로 내림차순 정렬한 앞부분입니다. CPU 수치는 측정·표시 방식에 영향을 받으므로 순간적인 화면 하나만으로 장애 원인을 단정하지 마세요. STAT의 첫 글자는 대표적인 상태를 나타냅니다. R은 실행 중이거나 실행 대기, S는 인터럽트 가능한 대기, D는 보통 중단할 수 없는 대기, T는 정지, Z는 자식이 종료됐지만 부모가 아직 회수하지 않은 좀비 상태입니다. 뒤에 붙는 문자는 추가 특성을 뜻할 수 있습니다.

top과 pgrep으로 변화를 살펴보기

top은 프로세스 목록과 자원 사용 상태를 주기적으로 갱신합니다. 화면의 정렬 기준과 표시 값은 환경에 따라 달라지며, 종료하려면 q를 누릅니다. 반복해서 ps를 실행하는 대신 변화의 흐름을 보고 싶을 때 유용합니다.

top

명령 이름으로 PID를 찾을 때는 pgrep을 사용할 수 있습니다. -a는 PID와 명령줄을 함께 보여 줍니다. 이름이 비슷한 프로세스가 여럿일 수 있고, 대상은 조회 직후 종료되거나 PID가 재사용될 수 있으므로 찾은 번호만 믿고 바로 종료하지 마세요.

pgrep -a sleep

조회 결과가 없다면 해당 이름의 프로세스가 없거나, 현재 사용자에게 정보가 제한됐거나, 검색 조건이 맞지 않을 수 있습니다. 자신의 프로세스를 지정해서 관찰할 때는 다음 실습처럼 셸이 기록한 PID를 사용하는 편이 명확합니다.

내 프로세스를 일시정지하고 다시 실행하기

다음 예는 Bash에서 실행합니다. sleep 300 &는 300초 동안 대기하는 프로세스를 백그라운드로 시작하며 $!는 방금 시작한 백그라운드 작업의 PID입니다. 다른 사용자의 프로세스나 운영 중인 서비스를 대상으로 이 신호 실습을 하지 마세요. 예제가 끝나기 전에 셸을 닫으면 실습 PID를 잃을 수 있으므로 같은 셸에서 끝까지 진행합니다.

sleep 300 &
practice_pid=$!
printf 'practice PID: %s\n' "$practice_pid"
ps -p "$practice_pid" -o pid,ppid,stat,etime,args
kill -STOP "$practice_pid"
ps -p "$practice_pid" -o pid,stat,args
kill -CONT "$practice_pid"
ps -p "$practice_pid" -o pid,stat,args

첫 ps에서 해당 sleep이 보이면 대상이 맞습니다. STOP 뒤에는 보통 상태 첫 글자가 T로 표시되고, CONT 뒤에는 다시 대기 상태 S 등으로 바뀝니다. 실제 상태는 관찰 시점에 따라 다릅니다. STOP은 종료가 아니라 실행 중단이며, CONT는 중단된 프로세스의 실행을 재개합니다.

TERM으로 종료를 요청하고 결과 확인하기

실습을 마칠 때 같은 셸에서 아래 명령을 실행합니다. TERM은 프로세스가 정리 작업을 수행할 기회를 주는 기본 종료 신호입니다. wait는 자식 프로세스가 끝날 때까지 기다리고 종료 상태를 회수합니다. 신호로 끝났으므로 wait의 종료 상태는 0이 아닐 수 있습니다.

kill -TERM "$practice_pid"
wait "$practice_pid"
ps -p "$practice_pid" -o pid,stat,args

마지막 ps에서 헤더만 나오거나 대상이 없다는 뜻으로 종료하면 보통 해당 PID의 실습 프로세스가 사라진 것입니다. 다만 PID는 재사용될 수 있으므로 오래 지난 뒤 같은 PID가 보인다고 동일 프로세스라고 단정하지 마세요. 프로그램이 TERM을 무시하거나 정리 중이면 잠시 기다려 상태와 로그를 확인합니다.

kill -KILL PID는 프로세스가 신호를 처리하거나 자체 정리할 기회를 주지 않습니다. 데이터 기록 중인 프로그램, 데이터베이스, 서비스에 사용하면 상태가 일관되지 않을 수 있으므로 원인과 대상이 확실하고 정상 종료가 실패했을 때만 고려하세요. 권한이 없는 프로세스에는 일반 사용자가 신호를 보낼 수 없습니다. 종료되지 않는 D 상태는 강제 신호만으로 즉시 해소되지 않을 수 있습니다.

셸의 foreground와 background

Bash에서 명령 &는 작업을 백그라운드로 시작하고, jobs -l은 현재 셸이 추적하는 작업 번호와 PID를 보여 줍니다. 이는 다른 터미널이나 시스템 전체의 모든 프로세스 목록이 아닙니다. 전경에서 실행한 작업을 Ctrl+Z로 멈췄다면 bg %1로 백그라운드에서 재개하거나 fg %1로 전경으로 가져올 수 있습니다. 실제 작업 번호는 jobs 결과를 보고 선택해야 합니다.

jobs -l

단순히 터미널에서 백그라운드로 돌렸다고 로그아웃 후에도 안정적으로 실행되는 서비스가 되는 것은 아닙니다. 세션·입출력·신호의 영향을 받습니다. 지속적으로 관리해야 하는 서버 프로세스는 해당 배포판의 서비스 관리 방식을 사용하는 편이 적합합니다.

프로세스가 문제일 때 판단 순서

  1. ps나 pgrep으로 PID·명령·소유 사용자·부모를 확인합니다. 이름만 보고 대상을 추측하지 않습니다.
  2. top과 관련 로그로 CPU·메모리 사용이 지속되는지, 단순 대기인지, 오류가 있는지 확인합니다.
  3. 서비스에 속한 프로세스인지 확인합니다. 서비스라면 관리자 도구와 서비스 로그를 먼저 살펴봅니다.
  4. 내 프로세스가 멈춰야 한다면 TERM으로 정상 종료를 요청하고 충분히 기다립니다. 필요할 때만 추가 조치를 선택합니다.
  5. 종료 후 다시 ps로 확인하고, 재시작·재발 여부와 원인을 조사합니다.

공식 문서

ps(1) 매뉴얼은 출력 필드와 상태 코드를, pgrep(1) 매뉴얼은 검색 조건을, kill(1) 매뉴얼은 신호 전송을 설명합니다. 셸 작업 번호와 fg·bg의 차이는 GNU Bash 작업 제어 문서를 참고하세요.

같은 카테고리의 다른 글
Linux / 명령어 / tracepath - 네트워크 경로와 경로 MTU 확인

Linux / 명령어 / tracepath - 네트워크 경로와 경로 MTU 확인

Linux tracepath 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / lscpu - CPU 아키텍처와 코어 정보 확인

Linux / 명령어 / lscpu - CPU 아키텍처와 코어 정보 확인

Linux lscpu 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux 강좌 / systemd 서비스와 부팅 로그 확인하기

Linux 강좌 / systemd 서비스와 부팅 로그 확인하기

리눅스 부팅 흐름과 systemd 유닛을 이해하고 서비스의 실행 상태와 자동 시작 설정을 구분합니다. systemctl과 journalctl로 상태·부팅 로그를 확인합니다.

Linux / 명령어 / alias - 명령어 별칭 만들기

Linux / 명령어 / alias - 명령어 별칭 만들기

Bash alias 명령어로 자주 쓰는 명령과 옵션 조합에 짧은 별칭을 만드는 방법을 설명합니다. 별칭 저장, 우회, 함수와의 차이 및 확장되지 않는 경우도 정리합니다.

Linux / 명령어 / type - 명령어 유형과 실행 대상 확인

Linux / 명령어 / type - 명령어 유형과 실행 대상 확인

Bash type 명령어로 별칭, 예약어, 함수, 내장 명령과 실행 파일을 구분하는 방법을 설명합니다. 모든 후보와 경로 확인, command -v·which와의 차이 및 스크립트 활용법을 다룹니다.

Linux / 명령어 / join - 공통 필드로 두 파일 결합

Linux / 명령어 / join - 공통 필드로 두 파일 결합

Linux join 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / Memo

Linux / Memo

리눅스와 관련된 여러 정보를 정리합니다.

Linux / 명령어 / apk - Alpine Linux 패키지 설치·제거와 저장소 갱신

Linux / 명령어 / apk - Alpine Linux 패키지 설치·제거와 저장소 갱신

Linux apk 명령어의 적용 배포판과 기본 작업을 설명합니다. 패키지 조회·설치 예제, 주요 옵션과 시스템 변경 시 주의점을 알아봅니다.

Linux / 명령어 / ssh-keygen - SSH 키 쌍 생성과 지문 확인

Linux / 명령어 / ssh-keygen - SSH 키 쌍 생성과 지문 확인

Linux ssh-keygen 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / clear - 터미널 화면 정리

Linux / 명령어 / clear - 터미널 화면 정리

Linux clear 명령어로 터미널 화면을 정리하는 방법을 설명합니다. 스크롤백을 보존하는 -x 옵션과 Ctrl+L·reset·tput의 차이, TERM 오류 해결법을 다룹니다.