Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

리눅스에서 프로세스를 종료하는 방법: top, ps, kill 명령어 완벽 가이드

리눅스에서 프로세스를 종료하는 방법은 매우 다양합니다. 이 튜토리얼에서는 문제가 발생한 프로세스를 찾아내고 종료하는 방법을 단계별로 알려드립니다.

프로세스는 쉽게 고아(orphan) 상태가 될 수 있습니다. 의도적이든 아니든 부모 프로세스가 충돌하면 자식 프로세스가 그대로 실행 상태로 남게 됩니다. 또한 부모 프로세스가 완료된 자식 프로세스를 회수(reap)하지 못하면 좀비(zombie) 프로세스가 되기도 합니다.

이 두 가지 경우 모두 해당 프로세스는 멈춰 있는 상태이므로 수동 개입이 필요합니다. 잡 컨트롤(job control)이 바로 그 해결책입니다. 지금부터 문제가 된 프로세스를 종료하는 방법을 살펴보겠습니다.

먼저 몇 가지 핵심 명령어를 확인해 보겠습니다:

  • top (그리고 왜 htop이 더 나은 선택인지)
  • ps
  • kill

top (검색과 종료)

프로세스에 종료 신호를 보내기 전에, 어떤 프로세스가 실행 중인지 먼저 파악해야 합니다. 문제가 있는 프로세스가 실행 중이라고 단정할 수 없고, 무엇을 찾아야 하는지도 미리 알기 어렵습니다. 바로 이럴 때 top이 유용합니다. vim을 실행한 뒤 백그라운드로 전환해 보겠습니다.

리눅스에서 프로세스를 종료하는 방법: top, ps, kill 명령어 완벽 가이드

vim

자, 이제 일반적인 방법으로는 조작할 수 없는 프로세스가 생겼습니다. top을 실행해 보겠습니다. 기본 출력만으로는 원하는 정보를 찾기 어려우므로 필터를 적용하겠습니다.

  • Shift+L 누르기
  • vim 입력
  • Enter 누르기
리눅스에서 프로세스를 종료하는 방법: top, ps, kill 명령어 완벽 가이드

top

결과가 화면에 나타났습니다. 첫 번째 줄에서 업타임(uptime), 사용자 수, 로드 애버리지(load average)를 확인할 수 있습니다. 각 열(column)에도 중요한 정보가 담겨 있습니다. 평소에는 S(상태), %CPU, TIME+ 항목을 주로 살펴봅니다. 프로세스 상태가 Z(zombie, 좀비)라면 종료 대상이라는 뜻입니다. CPU 사용률이 100%를 넘었다면 과부하 상태이므로 역시 종료가 필요할 수 있습니다. 또는 프로세스가 며칠째 계속 실행 중이라면 재시작할 시점일 수도 있습니다. 물론 다소 과민 반응일 수 있으며, 대부분의 경우 굳이 필요하지 않습니다.

오늘은 두 번째 줄에 주목하여 좀비 프로세스를 찾고 고아 프로세스를 검색해 보겠습니다. 이 예제에서는 좀비 프로세스가 실행 중이 아니므로 "2 stopped"(정지됨) 상태의 프로세스를 필터링해 보겠습니다.

  • o 입력
  • S=T 입력
리눅스에서 프로세스를 종료하는 방법: top, ps, kill 명령어 완벽 가이드

top 필터링

S=T(상태=stopped) 필터로 정지된 프로세스만 걸러냈으니, 이제 종료할 차례입니다. top 화면에서 k를 누르고 프로세스 PID를 입력한 후 Enter를 누르면 됩니다. 직접 실행해 보면 종료되기까지 시간이 걸린다는 것을 알게 될 겁니다. 이럴 때는 k를 다시 누르고 PID를 입력한 뒤 신호(signal)를 9로 변경하세요.

완벽한 방법은 아니지만, 상태 모니터링용으로 top 창을 띄워두고 있다면 이미 준비는 끝난 셈입니다. stop 신호 대신 kill 신호를 직접 전송할 수도 있습니다.

htop

솔직히 말씀드리면, htop은 top과 크게 다르지 않습니다. 색상만 다를 뿐이죠.

리눅스에서 프로세스를 종료하는 방법: top, ps, kill 명령어 완벽 가이드

htop

무척 알록달록하죠?

ps

ps(process status, 프로세스 상태). 시스템의 프로세스 정보를 확인할 수 있는 기본 유틸리티입니다. 이 도구는 /proc 디렉터리의 파일들을 읽어옵니다. 대부분의 경우 다음과 같은 옵션 조합으로 사용하게 됩니다:

리눅스에서 프로세스를 종료하는 방법: top, ps, kill 명령어 완벽 가이드

ps

  • -a: 모든 사용자의 프로세스 표시
  • -u: 프로세스 소유자 표시
  • -x: 터미널에 연결되지 않은 프로세스 표시

ps -aux를 단독으로 실행하면 모든 프로세스가 한꺼번에 출력되지만, 이는 실질적인 도움이 되지 않습니다. grep으로 파이프를 연결해 숨어 있는 vim을 찾아보겠습니다.

리눅스에서 프로세스를 종료하는 방법: top, ps, kill 명령어 완벽 가이드

ps -aux 명령어

찾았습니다! 참고로 목록에 현재 실행 중인 grep 명령도 함께 보일 겁니다. 이것조차 보고 싶지 않다면 grep 패턴을 조금 수정하면 됩니다.

리눅스에서 프로세스를 종료하는 방법: top, ps, kill 명령어 완벽 가이드

grep이 결합된 ps -aux 명령어

이렇게 하면 vim은 표시되지만, vim을 검색 중인 grep 프로세스 자체는 제외됩니다. 이제 프로세스를 종료(kill)해 보겠습니다. 먼저 killall을 시도하고, 이어서 kill을 사용해 보겠습니다.

프로세스 종료하기 (killall & kill)

필요한 정보는 모두 확보했습니다. 프로세스 이름(vim)과 프로세스 ID(140464)입니다. killall은 이름을 사용하고, kill은 프로세스 ID를 사용합니다. 두 명령어 모두 같은 신호 집합을 보낼 수 있으며, 가장 흔히 쓰이는 신호는 HUP, INT, KILL, TERM, STOP입니다. 더 자세히 알고 싶다면 kill -l로 전체 목록을 확인하세요.

리눅스에서 프로세스를 종료하는 방법: top, ps, kill 명령어 완벽 가이드

kill -l 명령어

주요 신호들을 하나씩 살펴보겠습니다:

  • HUP (신호 값 1): Hangup(연결 끊기). 전화선과 모뎀 시절부터 남아 있는 옛 용어입니다. 대부분의 시스템에서 HUP 신호는 데몬을 종료시키는 대신 재시작시킵니다.
  • INT (신호 값 2): Interrupt(인터럽트). 보통 프로세스 작업 중 CTRL+C로 인터럽트를 보낼 수 있는데, kill -2도 동일한 인터럽트 신호를 전송합니다.
  • KILL (신호 값 9): Kill(강제 종료). 보통 우리가 찾는 바로 그 신호입니다. 해당 PID를 즉시 종료시킵니다.
  • TERM (신호 값 15): Terminate(종료). 프로세스가 정상적으로 마무리되는 표준 방식입니다. 프로세스에게 예의를 갖추고 싶다면 이 신호로 우아하게 종료하는 것이 좋습니다. kill 명령은 기본적으로 신호 15를 보냅니다.
  • STOP (신호 값 17, 19, 23): 프로세스를 일시 정지합니다. 예를 들어 대용량 디렉터리를 복사하다가 일부 폴더를 제외하고 싶을 때, SIGSTOP으로 멈춘 뒤 폴더를 삭제하고 SIGCONT로 작업을 재개할 수 있습니다.

신호 값을 함께 안내해 드렸는데, 이 숫자 값은 SIGHUP처럼 길게 입력하는 대신 kill 명령에 바로 사용할 수 있습니다. 예를 들어:

  • killall -9 vim

위 명령은 vim이라는 이름을 가진 모든 프로세스를 강제 종료하려고 시도합니다. killall을 사용할 때는 실행 후 프로세스가 실제로 종료되었는지 반드시 확인하기를 권장합니다.

리눅스에서 프로세스를 종료하는 방법: top, ps, kill 명령어 완벽 가이드

killall -9 vim

남아 있는 프로세스가 있다면 kill -9에 프로세스 ID를 붙여 수동으로 종료하세요. 예:

  • kill -9 140464

마무리

지금까지 프로세스를 종료하는 간단한 방법을 살펴봤습니다. 과부하 상태의 프로세스는 top으로 먼저 확인하고, 멈춰 버린 GUI 프로그램에는 killall을, 남은 잔여 프로세스는 kill로 개별 정리하면 됩니다. 이 접근 방식만으로도 대부분의 문제를 해결할 수 있습니다.

확신이 서지 않는다면 재부팅하세요. 단, 재부팅 전에는 반드시 적절한 공지 절차를 따라야 합니다. 더 많은 셸 명령어를 익히며 리눅스 실력을 한 단계 끌어올려 보세요.