통합 검색
통합 검색
안녕하세요. 닷홈 입니다.
윈도우로 작업하던 도중에 "프로그램 응답 없음" 요즘에는 잘 못 보시죠?
그때마다 작업 관리자 켜서 프로그램 강제 종료하고 다시 시작하고는 하시는데요
리눅스에서도 역시 실행 중인 프로그램을 강제로 종료해야할 때가 있습니다. 서버 프로그램이라고 하더라도 완벽한 건 아니니까요.
오늘은 프로세스가 문제가 생겼을 때 강제로 종료하는 방법에 대해 알아보려고 합니다.
명령어 실행 도중에 문제가 생겼을 때
일단 첫 번째로 명령어 사용 중에 문제가 생긴 경우입니다.
복사, 파일 이동 등의 명령어를 사용 중에 너무 오래 걸려서 취소했거나 명령어를 잘못 쳐서 문제가 생겼을 때 어쩔 수 없이 강제로 해당
프로세스를 종료해야 하는 경우 어떻게 해야 하는지 알아봅시다.
첫 번째로는 Ctrl+C를 눌러서 SIGINT 신호를 보내는 겁니다.
SIGING 신호란 Signal Interrupt로 사용자가 프로세스를 종료하고 싶을 때 보내는 신호로 정해져 있습니다.
이 신호를 보내는 단축키가 Ctrl+C인 것이죠!
[root@letshosting ~]# sleep 10000
^C
[root@letshosting ~]#
그래서 문제가 생기거나 잘못된 경우에 강제로 종료하고 싶은 경우 Ctrl+C를 눌러 종료하시면 됩니다.
만약 Ctrl+C로도 종료가 안되는 프로그램이 간혹 있습니다.
그런 경우에는 Ctrl+Z 키를 눌러서 작업을 일시적으로 멈출 수 있습니다.
예시로 터미널을 일시적으로 멈추는 sleep 명령어를 사용한 뒤로 Ctrl+Z를 눌러서 일시 중지해보겠습니다.
[root@letshosting ~]# sleep 1000 # sleep 1000이면 1000초 동안 일시정지 합니다.
^Z
[2]+ 정지됨 sleep 1000
이렇게 한글로 설정하신 경우에는 "정지됨"으로 표시되고 일시적으로 프로세스가 멈춘 게 보이실 텐데요.
이때 아래와 같은 명령어로 종료해주시면 됩니다.
[root@letshosting ~]# kill %2
[root@letshosting ~]#
[2]- 종료됨 sleep 1000
여기서 %2에 숫자 2의 경우 위에서 Ctrl+Z로 프로세스를 일시 중지했을 때 앞에 나오는 [2]+에 있는 숫자를 적어주시면 됩니다.
서버프로그램에 문제가 생겼을 때
두 번째로는 이미 실행 중인 서버 프로그램에 문제가 생겨서 강제로 종료해야 하는 때 어떻게 해야 할까요?
먼저 서버 프로그램이 실행 중인 경우 "백그라운드에 프로세스가 켜져 있다"라고 말합니다.
그렇다면 백그라운드에 있는 프로세스를 확인하고 종료해야 합니다.
[root@letshosting ~]# pstree -hp
├─smbd(20331)─┬─cleanupd(20333)
│ ├─lpqd(20336)
│ └─smbd-notifyd(20332)
├─sshd(601)───bash(32108)─┬─pstree(32243)
│ └─sleep(32240)
├─starter(12339)───charon(12353)─┬─{charon}(12354)
│ ├─{charon}(12355)
│ ├─{charon}(12356)
먼저 그전에 확인했었던 프로세스 확인하는 방법을 통해서 종료하고자 하는 프로세스의 ID 값을 확인합니다.
예시에서는 sleep(32240)이기 때문에 32240이 프로세스 ID입니다.
해당 프로세스를 종료하기 위해서는 kill 를 입력합니다.
[root@letshosting ~]# kill 32240
이렇게 입력할 경우 Ctrl+C를 입력했을 때와 동일하게 종료됩니다.
하지만 기존에 Ctrl+Z로 프로세스를 일시정지시켰기 때문에 일시정지를 해제한 이후에 바로 종료됩니다.
[root@letshosting ~]# kill 32240
[root@letshosting ~]# jobs
[1]+ 정지됨 sleep 1000
[root@letshosting ~]# fg 1
sleep 1000
종료됨
또 다른 방법으로는 -9 옵션을 붙이는 방법입니다.
이렇게 할 경우 Ctrl+C를 입력했을 때처럼 알아서 종료하라는 명령을 내리는 것이 아닌 지금 당장 종료 시키는 명령을 내립니다.
컴퓨터 전원 버튼을 눌러서 강제로 끄는 것과 윈도우에서 종료하는 것을 비교하면 이해가 쉬우실 것 같습니다.
[root@letshosting ~]# kill -9 32278
[root@letshosting ~]#
[1]+ 죽었음 sleep 1000
이전 방법처럼 정지됨 -> 일시정지 해제 -> 종료됨 순서가 아닌 강제로 종료되어 버려서 죽었으므로 표시가 됩니다.
또 다른 방법으로 같은 이름의 프로세스가 여러 개 켜져 있다면 어떨까요?
실제로 httpd, php 같은 경우네는 같은 이름으로 수많은 프로세스가 켜지게 되는데요.
이럴 때 하나하나 끄면 엄청 힘들겠죠?
따라서 pkill이라는 명령어를 사용해서 종료하게 됩니다.
예시를 위해 sleep 1000을 5개 정도만 켜서 테스트해보겠습니다.
[root@letshosting ~]# pkill sleep
[2] 종료됨 sleep 1000
[3] 종료됨 sleep 1000
[4] 종료됨 sleep 1000
[5] 종료됨 sleep 1000
[6]- 종료됨 sleep 1000
sleep과 일치하는 프로세스들이 한 번에 다 종료된 모습 보이시나요?
pkill 명령어도 kill 명령어와 마찬가지로 -9 옵션을 강제 종료 역시 가능합니다.
비슷한 명령어로 killall이라는 명령어도 존재합니다.
killall의 경우 pkill 과는 다르게 조금 더 섬세하기 프로세스 이름을 지정하는 게 가능합니다.
이 부분에 대해서는 추후 정규 표현식에 대해 알아보면서 넘어가도록 하겠습니다.
[root@letshosting ~]# killall sleep
[2] 종료됨 sleep 1000
[3] 종료됨 sleep 1000
[4] 종료됨 sleep 1000
[5] 종료됨 sleep 1000
[6]- 종료됨 sleep 1000
작동 방식에는 약간의 차이가 있는데요!
pkill의 경우 모든 프로세스에서 sleep에 해당하는 걸 찾은 이후에 맨 마지막에 찾은 것들을 하나씩 종료하고 명령어가 끝나는 반면
killall의 경우 모든 프로세스에서 sleep을 찾을 때마다 종료하고 넘어가면서 모든 프로세스를 다 확인하고 나면 명령어가 끝나게 됩니다!!
정말 서버가 포화되어 조금의 명령어도 처리가 힘든 경우에는 pkill보다 killall을 사용하는 쪽이 조금 더 빠르게 프로세스가 종료되겠죠?
오늘은 프로세스를 종료하는 방법에 대해서 알아봤는데요.
어떻게 쉽게 잘 따라 하셨을지 모르겠네요.
잘 안쓰면서도 갑자기 앗! 하고 써야 할 때가 종종 있는 명령어들이니 기억 속 어딘가에 잘 놔두면 좋습니다 :)
감사합니다!
닷홈 홈페이지 :
무료홈페이지 | 무료호스팅 | 닷홈
https://www.dothome.co.kr/
닷홈 무료호스팅 신청하기 :
국내 1위 무료호스팅 | 닷홈
https://www.dothome.co.kr/web/free/index.php
기능제한 없는 진짜 무료홈페이지 신청하기 :
닷홈 | 호스팅은 닷홈
https://www.dothome.co.kr/homepage/free_builder_index.php
댓글 0