'ps'와 'kill'을 사용한 리눅스 프로세스 관리 이해 가이드

`ps`와 `kill`을 사용하여 실행 중인 애플리케이션을 관리하는 방법을 배우면서 필수적인 리눅스 시스템 관리 기술을 습득하세요. 이 가이드는 `ps`를 사용하여 프로세스 ID(PID), 리소스 사용량 및 상태를 검사하는 방법과, 우아한 종료(SIGTERM)부터 강제 중단(SIGKILL)에 이르기까지 특정 신호를 보내는 `kill`을 활용하여 안정적이고 제어된 시스템 운영을 보장하는 방법을 자세히 설명합니다.

35 조회수

Linux 프로세스 관리 이해하기: 'ps'와 'kill' 명령어 활용법

프로세스를 관리하는 것은 효과적인 Linux 시스템 관리의 기본입니다. 애플리케이션이 응답하지 않거나, 과도한 리소스를 소비하거나, 정상적으로 다시 시작해야 할 때, 해당 프로세스를 식별하고 상호 작용하는 방법을 아는 것이 중요합니다. 이 가이드는 Linux 프로세스 관리의 핵심인 프로세스 상태를 확인하는 ps 명령어와 프로세스 생명주기를 관리하기 위해 신호를 보내는 kill 명령어에 대한 포괄적인 소개를 제공합니다.

Linux가 실행 중인 프로그램(각각 고유한 프로세스 ID(PID) 할당)을 어떻게 처리하는지 이해하면 관리자는 시스템 안정성을 유지하고, 성능 병목 현상을 해결하며, 서비스가 예상대로 작동하도록 보장할 수 있습니다. 이 가이드에서는 모든 시스템 관리자의 도구 상자에서 필수적인 도구가 되는 명령어의 기본 구문과 일반적인 플래그를 탐구할 것입니다.

Linux 프로세스 모델: PID 및 상태

Linux에서 실행 중인 모든 프로그램, 서비스 또는 작업은 프로세스로 취급됩니다. 각 프로세스는 커널이 생성 시 할당하는 양의 정수인 프로세스 ID (PID)로 고유하게 식별됩니다. 이 PID는 시스템 도구가 특정 프로세스를 참조하고 조작하는 주요 방법입니다.

프로세스는 다양한 상태(예: 실행 중, 대기 중, 중지됨, 좀비)를 거칩니다. 상태를 알면 문제 해결 단계를 즉시 파악하는 데 도움이 됩니다.

ps 명령어로 프로세스 보기

ps (프로세스 상태) 명령어는 현재 실행 중인 프로세스에 대한 정보를 표시하는 데 사용됩니다. 출력 결과가 너무 많을 수 있으므로, 어떤 프로세스를 표시할지, 어떤 정보 열을 포함할지를 선택하기 위해 다양한 옵션이 사용됩니다.

필수 ps 구문 및 플래그

ps 플래그에는 두 가지 주요 스타일이 있습니다: Unix 스타일 (접두사 -) 및 BSD 스타일 (접두사 없음). 현대적인 방식은 포괄적인 보기를 위해 Unix 스타일 플래그를 결합하는 것을 선호하는 경우가 많습니다.

1. 모든 프로세스 보기 (BSD 스타일)

시스템 개요를 위한 가장 일반적인 명령어는 ps aux입니다.

  • a: 모든 사용자의 프로세스를 표시합니다.
  • u: 사용자 중심 형식으로 프로세스를 표시합니다 (사용자, CPU 사용량, 메모리 사용량 등을 표시).
  • x: 제어 터미널이 없는 프로세스(백그라운드 데몬 등)를 포함합니다.
ps aux

2. 표준 형식으로 프로세스 보기 (UNIX 스타일)

ps -ef 명령어는 이전 형식이지만 여전히 널리 사용되는 형식으로 전체 목록을 제공합니다.

  • -e: 모든 프로세스를 선택합니다.
  • -f: 전체 형식 목록을 표시합니다 (PPID 및 명령 인수 포함).
ps -ef

주요 출력 열 해석

사용된 플래그에 관계없이 특정 열은 프로세스 관리에서 중요합니다:

설명
PID 프로세스 ID (고유 식별자)
PPID 부모 프로세스 ID (이 프로세스를 시작한 프로세스의 PID)
USER 프로세스를 소유한 사용자
%CPU 사용된 CPU 시간 비율
%MEM 사용된 물리적 메모리 비율
VSZ 가상 메모리 크기 (KiB 단위)
RSS 상주 집합 크기 (사용된 물리적 메모리, KiB 단위)
STAT 프로세스의 현재 상태 (예: R=실행 중, S=대기 중, Z=좀비)
COMMAND 프로세스를 시작한 명령어

grep으로 프로세스 필터링

특정 프로세스를 찾으려면 ps의 출력을 grep으로 파이프하는 것이 일반적인 방법입니다.

예시: Apache 웹 서버(httpd)의 모든 실행 중인 인스턴스 찾기:

ps aux | grep httpd

팁: ps | grep을 사용할 때, 출력에 grep 명령어 자체가 표시되는 경우가 많습니다. 이를 필터링하려면 검색 패턴에 대괄호 표기법을 사용하십시오:
bash ps aux | grep '[h]ttpd'

kill 명령어로 프로세스 관리하기

kill 명령어는 단순히 프로세스를 중지시키는 것이 아니라 신호를 보냅니다. 기본 동작은 정상적인 종료를 요청하는 것이지만, 다른 신호를 통해 프로세스가 구성 파일을 다시 읽거나, 실행을 일시 중지하거나, 즉시 종료하도록 지시할 수 있습니다.

신호 이해하기

신호는 표준화된 숫자 또는 니모닉 코드입니다. kill -l을 사용하여 사용 가능한 신호를 나열할 수 있습니다.

신호 이름 신호 번호 설명
SIGTERM 15 기본 종료 신호입니다. 프로세스에게 정상적으로 종료하도록 요청합니다.
SIGKILL 9 즉각적이고 강제적인 종료 신호입니다. 프로세스는 이 신호를 무시할 수 없습니다.
SIGHUP 1 Hangup 신호로, 종종 데몬이 구성 파일을 다시 읽는 데 사용됩니다.
SIGSTOP 19 프로세스를 종료하지 않고 중지(일시 중지)합니다.
SIGCONT 18 중지된 프로세스를 다시 시작합니다.

kill로 신호 보내기

kill 명령어의 기본 구문은 다음과 같습니다:

kill -SIGNAL PID

1. 정상 종료 (최선의 방법)

항상 먼저 SIGTERM (신호 15)을 사용하여 프로세스를 정상적으로 종료하십시오. 이렇게 하면 애플리케이션이 데이터를 저장하고 연결을 닫을 시간을 갖게 됩니다.

kill 12345  # SIGTERM (15)으로 기본 설정
# 또는
kill -15 12345

2. 강제 종료 (최후의 수단)

프로세스가 응답하지 않고 SIGTERM을 무시하는 경우, SIGKILL (신호 9)을 사용하십시오. 이렇게 하면 정리 작업 없이 프로세스가 즉시 중지되므로 일부 애플리케이션에서는 데이터 손실이나 손상이 발생할 수 있습니다.

kill -9 12345

이름으로 프로세스 관리: pkillkillall

pskill은 PID에 의존하지만, 때로는 이름으로 프로세스를 타겟팅하는 것이 더 빠릅니다. 이 명령어는 여러 프로세스에 동시에 영향을 미칠 수 있으므로 극도의 주의를 기울여 사용하십시오.

killall

제공된 정확한 프로세스 이름과 일치하는 모든 프로세스를 종료합니다.

killall httpd  # 'httpd'라는 이름의 모든 프로세스에 SIGTERM을 보냅니다.
killall -9 cron  # 모든 'cron' 프로세스를 강제로 종료합니다.

pkill

killall보다 더 많은 유연성을 제공하며, 신호를 보낼 프로세스를 선택할 때 패턴 매칭(정규 표현식)을 허용합니다.

# 명령어 이름에 'firefox'가 포함된 모든 프로세스를 종료합니다.
pkill -f firefox

killallpkill에 대한 경고: 실수로 중요한 시스템 프로세스(init 또는 systemd 등)를 타겟팅하면 전체 운영 체제가 불안정해지거나 충돌할 수 있습니다. killall 또는 pkill을 광범위한 패턴으로 사용하기 전에 항상 ps를 사용하여 타겟 PID를 확인하십시오.

프로세스 관리 워크플로우 요약

실행 중인 애플리케이션 문제를 해결할 때 다음과 같은 체계적인 접근 방식을 따르십시오:

  1. 식별: ps aux | grep <process_name>을 사용하여 프로세스 PID를 찾고 상태를 확인합니다.
  2. 상태 확인: STAT 열을 검토합니다. Z(좀비)인 경우, 부모 프로세스가 비활성화되었으며 부모를 종료할 수 없는 경우 재부팅이 필요할 수 있습니다.
  3. 정상 중지 시도: SIGTERM (기본값 kill PID)을 보냅니다. 몇 초간 기다립니다.
  4. 중지 확인: ps를 다시 실행합니다.
  5. 강제 중지 (필요한 경우): 프로세스가 계속 실행되면 SIGKILL (kill -9 PID)을 보냅니다.

pskill을 마스터하는 것은 건강하고 반응성이 좋은 Linux 환경을 유지하는 데 필수적입니다. PID와 사용 가능한 다양한 신호를 이해함으로써 관리자는 시스템 실행을 정밀하게 제어할 수 있습니다.