리눅스 프로세스 종료 명령어: kill 활용법

kill 명령어는 지정된 프로세스나 프로세스 그룹에 시그널을 전송하여 프로세스를 제어하는 데 사용됩니다. 별도의 시그널이 지정되지 않으면 기본적으로 SIGTERM 시그널이 전송되며, 이 시그널은 해당 시그널을 처리하지 않는 프로세스를 종료시킵니다. 일부 프로세스는 SIGTERM을 무시할 수 있으므로 강제 종료가 필요한 경우 SIGKILL(-9) 시그널을 사용해야 합니다.

대부분의 셸 환경에는 내장된 kill 기능이 포함되어 있으며, 이 문서에서 설명하는 옵션들을 대부분 지원합니다. 특히 '-a' 및 '-p' 옵션과 프로세스 이름으로 PID를 지정하는 기능은 로컬 확장 기능입니다.

시그널 값으로 0을 지정하면 실제 시그널은 전송되지 않지만, 오류 검사를 수행할 수 있습니다.

명령어 옵션

PID 인자에는 다음 다섯 가지 형식 중 하나를 사용할 수 있습니다:

  • n (n > 0): PID가 n인 특정 프로세스에 시그널 전송
  • 0: 현재 프로세스 그룹의 모든 프로세스에 시그널 전송
  • -1: PID가 1보다 큰 모든 프로세스에 시그널 전송
  • -n (n > 1): 프로세스 그룹 n의 모든 프로세스에 시그널 전송. 이 형식의 인자를 사용할 때는 먼저 시그널을 지정하거나 '--' 옵션을 앞에 붙여야 합니다.
  • commandname: 해당 이름으로 실행 중인 모든 프로세스에 시그널 전송
-s signal   전송할 시그널을 지정합니다. 시그널 이름이나 숫자를 사용할 수 있습니다.
-l          사용 가능한 시그널 목록을 출력합니다. (/usr/include/linux/signal.h 참조)
-a          프로세스 처리 시 명령어 이름과 프로세스 번호의 매핑 제한을 해제합니다.
-p          시그널을 전송하지 않고 지정된 프로세스의 PID만 출력합니다.

사용 예제

사용 가능한 모든 시그널 목록을 확인하려면 다음과 같이 입력합니다:

[root@CentOS6 ~]# kill -l
 1) SIGHUP     2) SIGINT     3) SIGQUIT    4) SIGILL     5) SIGTRAP
 6) SIGABRT    7) SIGBUS     8) SIGFPE     9) SIGKILL   10) SIGUSR1
11) SIGSEGV   12) SIGUSR2   13) SIGPIPE   14) SIGALRM   15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD   18) SIGCONT   19) SIGSTOP   20) SIGTSTP
21) SIGTTIN   22) SIGTTOU   23) SIGURG    24) SIGXCPU   25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF   28) SIGWINCH  29) SIGIO     30) SIGPWR
31) SIGSYS    34) SIGRTMIN  35) SIGRTMIN+1 ...           64) SIGRTMAX

주요 시그널들의 의미는 다음과 같습니다:

SIGHUP      1 터미널 연결 해제
SIGINT      2 인터럽트 (Ctrl + C와 동일)
SIGQUIT     3 종료 (Ctrl + \와 동일)
SIGKILL     9 강제 종료 (무조건 종료)
SIGTERM    15 정상 종료 (기본 시그널)
SIGCONT    18 재개 (fg/bg 명령과 동일)
SIGSTOP    19 일시정지
SIGTSTP    20 일시중지 (Ctrl + Z와 동일)

특정 시그널의 숫자 값을 확인할 수 있으며, SIG 접두사 유무는 결과에 영향을 주지 않습니다:

[xf@xuexi ~]$ kill -l SIGKILL
9
[xf@xuexi ~]$ kill -l KILL
9
[xf@xuexi ~]$ kill -l SIGTERM
15
[xf@xuexi ~]$ kill -l TERM
15

주의사항: init 프로세스(PID 1)는 리눅스 시스템에서 필수적인 프로세스로, 커널이 부팅된 후 가장 먼저 시작되는 사용자 레벨 프로세스입니다. 이 프로세스는 종료할 수 없으며, 시스템의 모든 다른 프로세스는 init 프로세스의 자식 프로세스입니다.

리눅스 프로세스 관리 개요

프로세스는 리눅스 시스템에서 핵심적인 개념으로, 리눅스는 멀티태스킹 운영체제로서 동시에 여러 프로세스를 실행할 수 있습니다. 사용자는 프로세스가 어떻게 시간 슬라이스를 할당받는지에 대해서는 신경 쓰지 않고, 단지 프로세스를 효과적으로 제어하여 시스템 자원을 최적화하는 데 집중하면 됩니다.

리눅스 시스템의 프로세스는 다음과 같은 세 가지 유형으로 구분됩니다:

  1. 대화형 프로세스: 쉘에서 시작되는 프로세스로, 포그라운드나 백그라운드에서 실행 가능
  2. 배치 프로세스: 터미널과 연결되지 않은 순차적 실행 프로세스
  3. 데몬 프로세스: 시스템 부팅 시 자동으로 시작되어 백그라운드에서 지속적으로 실행되는 프로세스 (예: httpd는 Apache 웹 서버의 데몬 프로세스)

kill 명령어 작동 원리

kill 명령어는 리눅스 커널에 시스템 운영 시그널과 특정 프로그램의 프로세스 식별번호(PID)를 전달하여, 커널이 해당 PID의 프로세스에 대해 작업을 수행하도록 합니다. top 명령어를 통해 실행 중인 다양한 프로세스를 확인할 수 있으며, 시스템 자원을 확보하기 위해 특정 프로세스를 종료해야 할 때 kill 명령어를 사용합니다.

시스템 가상 콘솔의 역할 중 하나는 프로그램 오류로 인해 시스템이 멈출 때 다른 가상 콘솔로 전환하여 문제 프로세스를 종료할 수 있는 것이며, 이때 사용되는 명령어가 바로 kill입니다. 대부분의 쉘에서 kill이 내부 명령어로 구현되어 있어 직접 호출이 가능합니다.

태그: linux process-management system-administration shell-commands

7월 25일 08:31에 게시됨