[Linux] 프로세스 종료 명령어 모음 (kill, pkill, fuser)
리눅스 서버를 운영하다 보면 비정상적으로 동작하는 프로세스를 종료하거나, 포트를 점유한 프로세스를 강제로 종료해야 하는 상황이 발생합니다.
이번 포스팅에서는 프로세스를 종료하는 명령어들과 시그널의 개념을 정리해보겠습니다.
프로세스 확인 방법은 [Linux] 프로세스 확인 명령어 모음 (ps, top, lsof, ss) 포스팅을 참고해주세요.
1. 시그널(Signal)
프로세스를 종료할 때는 운영체제가 해당 프로세스에 시그널(Signal)을 전송하는 방식으로 동작합니다.
어떤 시그널을 사용하느냐에 따라 종료 방식이 달라지므로, 시그널의 종류를 먼저 이해하는 것이 중요합니다.
시그널이란 프로세스에게 특정 이벤트가 발생했음을 알리는 소프트웨어 인터럽트입니다.
아래는 프로세스 종료 시 자주 사용되는 주요 시그널입니다.
| Signal | 번호 | Description |
|---|---|---|
| SIGHUP | 1 | 터미널 연결이 끊어졌을 때 전송, 설정 파일 재로드 용도로도 활용 |
| SIGINT | 2 | 키보드 인터럽트 (Ctrl+C)와 동일한 동작 |
| SIGKILL | 9 | 프로세스를 즉시 강제 종료, 프로세스가 거부할 수 없음 |
| SIGTERM | 15 | 프로세스에게 정상 종료를 요청, 프로세스가 종료를 거부할 수 있음 (기본값) |
일반적으로는 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
pkill은 killall과 유사하게 프로세스 이름을 기반으로 종료하지만, 이름의 일부만 입력해도 패턴 매칭으로 동작합니다.
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. 명령어 비교
| 명령어 | 대상 지정 방식 | 특징 |
|---|---|---|
| kill | PID | 정확한 프로세스 하나를 지정하여 종료 |
| 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
