본문 바로가기

Linux & Mac

프로세스 관리툴 : 리눅스에서 프로그램 강제 종료하기 (htop)

반응형

컴퓨터를 이용하다 보면 다양한 이유로 컴퓨터가 느려질 수 있죠. 그 이유 중 가장 높은 확률로 발생하는 문제는 특정 프로세스가 CPU를 과도하게 이용하거나, 메모리를 너무 많이 써서 SWAP을 이용하게 된 경우죠. 이럴 때 우린 프로세스 관리자를 켜고, 문제가 된 프로세스를 강제 종료시킵니다.

그런데 만약 이런 문제가 터미널로 접속하여 이용하는 고성능 컴퓨팅 머신 혹은 AWS 서버 등에서 발생하면 어떻게 해야 할까요. 우리에겐 비주얼로 메모리와 CPU의 사용량을 보여줄 툴이 없습니다. 숙련자는 "ps" 커맨드를 이용하여, 문제가 된 프로세스를 찾고 "kill" 명령어로 프로세스를 강제 종료시킵니다. 방법은 아래와 같습니다. 그보다 쉬운 툴을 이용하는 방법은 구분선 밑에 있습니다.


터미널에서 구동된 프로세스는 ctrl + c와 같은 시그널 전송 키를 이용해서, 프로세스를 강제 종료시킬 수 있죠. 하지만 백그라운드로 실행시킨 프로세스는 특정 키로 시그널을 전송할 수 없죠. 그래서 kill을 이용해 강제 종료시키게 됩니다. 그러기 위해서는 프로세스 아이디부터 확인해야 합니다. 다양한 방법이 있지만 보통 ps 커맨드를 이용해 확인하죠. 명령어는 아래와 같습니다.

ps는 프로세스의 정보를 보여주는 명령어고, grep은 출력될 내역에서 뒤에 따라오는 문구를 찾아 검색하는 명령입니다. 그냥 "ps -ef"를 입력하면 사용자가 구동시킨 프로세스와 리눅스가 구동시킨 프로세스가 같이 출력되기 때문에 특정 문구를 검색해서 보여달라고 요청하는 것이지요. 이때 [process name]은 전체 이름을 넣지 않고 "sh"나 "print"와 같은 문구만 넣으셔도 됩니다. "nohup"은 프로세스 이름으로 등록되지 않아서 검색해도 소용없습니다.

ps -ef | grep [process name]

위 명령어로 프로세스의 아이디를 확인하셨다면, 아래 명령어로 정지 시그널을 주시면 됩니다. 

kill [process id]

프로세스를 정지시키는 예제는 아래 스냅숏과 같습니다. 먼저 백그라운드로 구동된 프로세스의 프로세스 아이디는 프로세스 구동 뒤 즉시 출력(보라색 상자)됩니다. "ps"와 "grep" 명령어로 관련 프로세스를 검색해 보면 노란색 상자와 같이 13431번 프로세스 아이디로 구동 중인 프로세스가 있죠. 이에 대해 붉은색 상자와 같이 kill 명령어로 정지시키면 됩니다. 


이 문제의 시발점은 간단하죠. "GUI로 프로세스의 상태를 볼 수 없다"입니다. 우린 터미널을 이용하니까요. 하지만 다행히 우리보다 똑똑한 누군가들은 이 문제를 인지하고 이미 해결해 두었죠. "htop"는 터미널에서도 접속한 컴퓨터의 프로세스 상태를 보여주고 관리할 수 있는 툴입니다.

 

1. 설치

설치 명령은 간단합니다. 현대 리눅스 시스템은 저장소 관리가 잘되어 있으니 이를 이용하면 되죠. 만약 이용하는 게 OSX라면 아래 링크된 다른 글을 참조해 주세요.

# CentOS
sudo yum install htop

# 저장소에 htop이 없는 경우
sudo yum -y install epel-release
sudo yum install htop

# Ubuntu
sudo apt-get install htop

# OSX
brew install htop

2020/10/12 - [Mac] - Mac 에 Brew 설치하기 (Catalina)

 

Mac 에 Brew 설치하기 (Catalina)

Mac을 이용하다 보면 open source 프로그램에 대한 필요성이 발생하게 되죠. Ubuntu 에서 apt-get, centos에서 yum을 이용해 각종 패키지를 설치하는 것과 같이요. 이럴땐 필요한 패키지를 관리하는 사이트

sbinroom.tistory.com

2. 구동 및 운영

구동은 터미널에 다른 변수 없이 "htop"를 입력하시면 됩니다. 입력 파라미터가 약간 있으니 확인해 보실 분은 "htop --help"를 참조하시면 됩니다. 구동을 하면 터미널엔 아래 스냅숏과 같은 화면이 보입니다.

htop가 보여주는 정보는 크게 3가지로 구분할 수 있습니다. 첫 번째는 빨간 박스로 구분된 영역으로 프로세서의 수와 상태, 메모리와 SWAP사용량을 보여줍니다. 두 번째는 보라색 박스로 구분된 영역으로 프로세스별 상태를 보여줍니다. 세 번째는 노란 박스로 구분된 영역으로 사용할 수 있는 커맨드를 보여줍니다. 

일반적인 상태에서 펑션키는 매핑된 기능을 수행하고, 화살표 키는 보라색 박스 안에서 선택된 프로세스를 변경합니다. 선택된 프로세스는 제 경우에는 민트색의 배경색으로 표현되었으나 구동 환경에 따라 색상은 다를 수 있습니다. 그리고 중요한 것!! 마우스 사용이 가능합니다. 아주 중요하니까 밑줄에 이탤릭에 볼드 처리까지!!! 물론 구동 환경에 따라 안될 수도 있으니 염려하지 말고, 낙심하세요. 

마우스를 이용할 수 있는 공간은 노란색 박스의 모든 버튼들과 보라색 박스 영역입니다. 보라색 박스 영역에서는 휠 스크롤도 동작하며, 클릭 시 해당 프로세스가 선택된 것으로 인식합니다. 또한 보라색 박스의 위쪽 제목 줄을 클릭하면, 선택된 제목으로 프로세스들이 정렬됩니다. 

종료

프로그램을 종료하고자 하시는 경우 키보드의 "q" 키나 "F10"을 누르시면 됩니다.

정렬

"htop"의 친절?! 한 설명과 같이 F6를 누르면 정렬 방식을 변경할 수 있습니다. 기본 정렬 방식은 "CPU"입니다. 상기와 같이 마우스를 이용해 제목을 클릭할 수도 있으나 F6를 눌러 정렬하면, 아래 스냅숏과 같은 화면이 나옵니다.

보라색 박스 영역이 분할되어 선택 가능한 정렬 방식이 왼쪽에 보입니다. 화살표 키로 선택하여 "Enter"를 누르면 해당 방식으로 정렬됩니다.(역방향은 어떻게 하는지 모르겠어요..ㅜ,.ㅜ 마우스로는 한 번 더 클릭하면 역방향 정렬이 됩니다.)

검색과 필터

검색과 필터 방법에 대한 설명 이전에 프로세스를 늘려 보겠습니다. 이전에 만든 소수의 개수를 세는 프로그램을 시리얼 버전으로 동시에 8개 구동시킵니다. 프로세스가 장시간 구동 되도록 10,000,000 이하의 소수 갯수를 계산하도록 하겠습니다. 구동한 스크립트는 아래 스냅숏과 같습니다.

nohup을 이용해서 8개의 프로그램을 동시 구동 시킵니다. nohup을 왜 이용하는지 등에 대해서는 아래 링크의 글을 참조해 주세요. 

2020/09/22 - [ubuntu] - nohup 사용법 ( 터미널 로그아웃 후 프로세스 실행 유지 )

 

nohup 사용법 ( 터미널 로그아웃 후 프로세스 실행 유지 )

대부분은 nohup의 목적을 알고 오셨으리라 생각해서 사용 방법부터 간단히 짚어 드린 뒤 자세한 설명을 하겠습니다. nohup [command] > [output file name] & [command]에는 보통 스크립트의 구동 명령이 들어

sbinroom.tistory.com

위 스크립트를 실행시키면 8개의 프로그램이 맹렬히 구동하고, htop으로 보면 내역을 정확히 알 수 있죠. 아래 스냅숏이 구동후 htop의 출력입니다. 16개의 프로세서 중 8개가 95% 이상으로 구동되고 있으며, 프로세스 리스트에서도 99% 이상의 CPU를 이용하고 있는 8개의 프로세스가 있습니다. 

이때 원하는 내역을 검색해서 보고자 하면 "F3"를 누릅니다. 아래 스냅숏의 왼쪽이 누른 직후입니다. 빨간 박스와 같이 하단의 기능키 바가 변경되었죠. 이제 문자를 타이핑하면 우측 스냅숏의 보라색 박스와 같이 입력되면서 검색된 프로세스는 배경색이 변경(파란색 박스)됩니다. 검색 결과가 다수인 경우 "F3" 키를 통해 다음 것으로 변경할 수 있습니다. 

사실 검색 기능을 언제 사용할지 잘 모르겠네요. 필터 기능으로 넘어가죠. "ESC" 키로 원래 htop 화면으로 나온 뒤 "F4" 키를 이용해 필터 기능을 켭니다. 동작 방식의 위 검색과 같으나 파란색 박스와 같이 결과가 다르게 나옵니다. 검색의 결과는 전체 프로세스를 보여주면서 검색된 프로세스의 배경색을 변경하여 보여 주었지만, 필터 기능을 이용하면 검색과 일치하는 결과만 추려서 보여줍니다.

이 상황에서 "Enter" 키와 "Esc" 키가 각각 다르게 동작합니다. 아래 스냅숏을 보시면 왼쪽은 "Enter" 키를 오른쪽은 "Esc" 키를 눌렀을 때 상황입니다. 좌측에는 필터링된 결과가 보이지만 우측은 필터가 취소되어 전체 프로세스를 보여주죠. 

3. 시그널 전송 (프로세스 끄기)

가장 중요한 건 이 부분이죠. 프로세스를 종료하는 방법입니다. 이글의 시작부에 일반적인 방법은 작성해 두었습니다. htop을 이용하면 쉽게 PID를 확인하실 수 있으니 아래 커맨드를 활용해서 프로세스를 제거하셔도 됩니다. 먼저 다른 터미널로 아래 커맨드를 활용해 3908번 Process ID를 가진 프로세스에 kill 시그널을 주겠습니다. 

kill [PID]

아래 스냅숏의 우측 터미널에서 킬 시그널을 전송했죠. 좌측 터미널의 htop을 보시면 3908번 프로세스가 종료되었음을 확인하실 수 있습니다. 이렇게 PID를 알고 있으니 kill 명령어로 제거하셔도 됩니다. 

그럼 htop에서 프로세스를 끄는 법을 설명하죠. 주의 : 실수 방지를 위해 필터 기능으로 원하는 프로세스만 출력되게 한 뒤, 실행하세요. 화살표를 이용해 원하는 프로세스를 선택하고 'k' 혹은 'F9' 키를 누르세요. 아래 스냅숏과 같이 전송할 시그널을 선택하라는 창이 생깁니다. 여기서 화살표로 선택하거나 '9'키를 누르면 kill 시그널이 선택됩니다. 이후 'Enter'키를 누르시면 프로세스가 종료됩니다. 

이런 방식으로 프로세스를 종료시키시면 돼요. 하지만 리눅스에 익숙해지시고 나면 'ps', 'grep', 'kill' 명령어를 이용하는 게 더 편하다는 걸 알게 되실 것입니다. 심하면 스크립트의 반복문을 이용하기도 하고요. 

그럼 이만 마치겠습니다. 왠지 이글에선 먼가 모자란 느낌이 드는데 착각이겠죠. 혹시 모자란 게 무엇인지 느낀 분이 계시다면 댓글 부탁드립니다. 조치할게요. 

 

반응형