Post

[Linux] 프로세스 종료 명령어 모음 (kill, pkill, fuser)

[Linux] 프로세스 종료 명령어 모음 (kill, pkill, fuser)

리눅스 서버를 운영하다 보면 비정상적으로 동작하는 프로세스를 종료하거나, 포트를 점유한 프로세스를 강제로 종료해야 하는 상황이 발생합니다.
이번 포스팅에서는 프로세스를 종료하는 명령어들과 시그널의 개념을 정리해보겠습니다.

프로세스 확인 방법은 [Linux] 프로세스 확인 명령어 모음 (ps, top, lsof, ss) 포스팅을 참고해주세요.

1. 시그널(Signal)


프로세스를 종료할 때는 운영체제가 해당 프로세스에 시그널(Signal)을 전송하는 방식으로 동작합니다.
어떤 시그널을 사용하느냐에 따라 종료 방식이 달라지므로, 시그널의 종류를 먼저 이해하는 것이 중요합니다.

시그널이란 프로세스에게 특정 이벤트가 발생했음을 알리는 소프트웨어 인터럽트입니다.
아래는 프로세스 종료 시 자주 사용되는 주요 시그널입니다.

Signal번호Description
SIGHUP1터미널 연결이 끊어졌을 때 전송, 설정 파일 재로드 용도로도 활용
SIGINT2키보드 인터럽트 (Ctrl+C)와 동일한 동작
SIGKILL9프로세스를 즉시 강제 종료, 프로세스가 거부할 수 없음
SIGTERM15프로세스에게 정상 종료를 요청, 프로세스가 종료를 거부할 수 있음 (기본값)

일반적으로는 SIGTERM(15)으로 먼저 정상 종료를 시도하고, 응답이 없을 경우 SIGKILL(9)로 강제 종료하는 방식이 권장됩니다.

kill -l 명령어를 사용하면 시스템에서 지원하는 모든 시그널 목록을 확인할 수 있습니다.

2. kill


kill은 PID를 지정하여 해당 프로세스에 시그널을 전송하는 명령어입니다.

1
$ kill [옵션] [PID]

시그널을 별도로 지정하지 않으면 기본값인 SIGTERM(15)이 전송됩니다.

1
2
3
4
5
6
7
8
# SIGTERM으로 정상 종료 요청 (기본값)
$ kill 1234

# SIGKILL로 강제 종료
$ kill -9 1234

# 시그널 이름으로도 지정 가능
$ kill -SIGKILL 1234

3. killall


killall은 PID 대신 프로세스 이름을 지정하여 일치하는 모든 프로세스에 시그널을 전송하는 명령어입니다.

1
$ killall [옵션] [프로세스 이름]

아래는 nginx라는 이름의 모든 프로세스를 종료하는 예시입니다.

1
2
3
4
5
# SIGTERM으로 정상 종료 요청 (기본값)
$ killall nginx

# SIGKILL로 강제 종료
$ killall -9 nginx

killall은 입력한 이름과 정확히 일치하는 프로세스를 대상으로 합니다.

4. pkill


pkillkillall과 유사하게 프로세스 이름을 기반으로 종료하지만, 이름의 일부만 입력해도 패턴 매칭으로 동작합니다.

1
$ pkill [옵션] [프로세스 이름 패턴]

아래는 이름에 ngin이 포함된 모든 프로세스를 종료하는 예시입니다.

1
2
3
4
5
6
7
8
# SIGTERM으로 정상 종료 요청 (기본값)
$ pkill ngin

# SIGKILL로 강제 종료
$ pkill -9 ngin

# 특정 사용자의 프로세스만 종료
$ pkill -u www-data nginx

5. fuser


fuser는 특정 파일이나 소켓을 사용 중인 프로세스를 조회하고, 직접 종료할 수 있는 명령어입니다.
PID를 별도로 확인하지 않고 포트 번호만으로 프로세스를 종료할 수 있어 매우 간편합니다.

1
2
3
4
5
# 포트를 사용 중인 프로세스 조회
$ fuser [포트번호]/tcp

# 포트를 사용 중인 프로세스 종료 (-k 옵션)
$ fuser -k [포트번호]/tcp

아래는 8000번 포트를 점유한 프로세스를 한 번에 종료하는 예시입니다.

1
2
$ fuser -k 8000/tcp
8000/tcp: 1234

fuser가 설치되어 있지 않다면 sudo apt install psmisc 명령어로 설치할 수 있습니다.

6. 명령어 비교


명령어대상 지정 방식특징
killPID정확한 프로세스 하나를 지정하여 종료
killall프로세스 이름 (정확히 일치)동일한 이름의 모든 프로세스를 한 번에 종료
pkill프로세스 이름 (패턴 매칭)이름의 일부로 검색하여 매칭되는 프로세스 종료
fuser포트 번호PID 확인 없이 포트 번호만으로 바로 종료

7. 주의사항


프로세스 종료 시 아래 사항들을 반드시 확인하시기 바랍니다.

⚠️ SIGKILL 사용 시 주의

SIGKILL(9)은 프로세스가 종료 처리를 할 기회 없이 즉시 강제 종료됩니다.
이로 인해 임시 파일이나 락(lock) 파일이 정리되지 않아 이후 프로세스 재시작 시 문제가 발생할 수 있습니다.
가능하면 SIGTERM(15)으로 먼저 정상 종료를 시도한 후, 응답이 없는 경우에만 SIGKILL을 사용하는 것이 좋습니다.

⚠️ 시스템 프로세스 종료 시 주의

init 또는 systemd와 같은 시스템 핵심 프로세스를 종료하면 시스템이 불안정해지거나 강제 재부팅될 수 있습니다.
종료 대상 프로세스가 어떤 역할을 하는지 반드시 확인 후 진행해야 합니다.

⚠️ 시스템 서비스는 systemctl 사용

Nginx, MySQL 등 systemd로 관리되는 서비스는 kill로 직접 종료하는 것보다 systemctl stop 명령어로 종료하는 것이 안전합니다. kill로 강제 종료하면 서비스가 자동으로 재시작되거나 상태가 불일치할 수 있습니다.

⚠️ 권한 확인

다른 사용자 소유의 프로세스를 종료하거나 1024번 미만의 잘 알려진 포트(Well-known Port)를 다룰 때는 sudo 권한이 필요합니다.

1
2
$ sudo kill -9 1234
$ sudo fuser -k 80/tcp
This post is licensed under CC BY 4.0 by the author.