때로는 작동하지 않는 프로세스를 중단시키는 유일한 방법은 강제로 종료하는 것입니다. Linux나 macOS와 같은 운영체제에서 명령줄을 통해 이 작업을 수행하는 방법을 알아보겠습니다.
프로세스란 무엇일까요?
프로세스란, 웹 브라우저와 같은 실행 중인 프로그램, 데스크톱 환경 관련 백그라운드 작업, 시스템 서비스 등을 포함한 모든 실행 단위를 의미합니다.
프로세스는 크게 두 가지 유형으로 나눌 수 있습니다.
전경 프로세스는 사용자가 직접 실행하거나 상호 작용하는 프로그램입니다. 터미널 창에서 실행되거나 그래픽 사용자 인터페이스를 통해 실행될 수 있습니다. 반면, 백그라운드 프로세스는 사용자 개입 없이 자동으로 실행되며, 사용자로부터 입력을 받거나 결과를 표시하지 않습니다. 이러한 프로세스는 서비스나 데몬과 같은 시스템 작업을 담당합니다.
무대에 비유하자면, 전경 프로세스는 연극의 배우와 스태프와 같고, 백그라운드 프로세스는 무대 뒤에서 보이지 않게 일하는 팀과 같습니다.
프로세스가 오작동하거나 예상치 못한 오류가 발생하면 CPU나 RAM을 과도하게 사용하거나, 계산 루프에 갇혀 응답하지 않는 상태가 될 수 있습니다. 예를 들어, 그래픽 응용 프로그램이 마우스 클릭에 반응하지 않거나, 터미널 응용 프로그램이 명령 프롬프트를 반환하지 않을 수 있습니다.
강제 종료, 최후의 수단
프로세스를 “종료”한다는 것은 “강제 종료”를 의미하며, 이는 프로세스가 정상적으로 응답하지 않을 때 사용하는 최후의 방법입니다.
Linux는 이러한 상황에 대처하기 위해 kill
, pkill
, killall
과 같은 명령어를 제공합니다. 이 명령어들은 그래픽이나 명령줄, 전경이나 배경 등 모든 유형의 프로세스에 적용할 수 있습니다.
kill
명령어 사용법
kill
명령어를 사용하려면 종료하려는 프로세스의 PID(프로세스 ID)를 알아야 합니다. ps
명령어를 사용하면 프로세스의 PID를 확인할 수 있습니다.
시스템의 모든 프로세스를 검색하려면 ps -e
명령어를 사용하세요. 출력 결과가 많으므로 less
를 통해 파이프하여 결과를 보는 것이 좋습니다. 다음 명령어를 입력하여 실행하세요.
ps -e | less
이 명령어는 아래 이미지와 유사한 프로세스 목록을 표시합니다. /
키를 눌러 검색어를 입력하고 아래로 검색할 수 있으며, ?
키를 사용하여 위로 검색할 수 있습니다.
특정 프로세스를 찾으려면 ps
명령어의 출력을 grep
으로 파이프하고 찾고자 하는 프로세스의 이름(또는 이름의 일부)을 지정합니다.
ps -e | grep shutter
종료하려는 프로세스의 PID를 찾았으면, kill
명령어에 해당 PID를 매개변수로 전달합니다. 예를 들어, 이전 명령으로 확인한 셔터 프로세스를 종료하려면 다음 명령을 사용합니다.
kill 2099
kill
명령어는 성공적으로 실행되어도 별다른 피드백을 제공하지 않는 조용한 암살자와 같습니다.
pkill
명령어 활용
pkill
명령어는 프로세스 이름으로 프로세스를 종료할 수 있게 해줍니다. PID를 알 필요 없이, pkill
에 검색어를 전달하면 해당 검색어와 일치하는 모든 프로세스가 종료됩니다. 따라서 검색어의 철자가 정확한지 확인해야 합니다.
안전하게 pkill
명령어를 사용하기 전에, pgrep
명령어를 활용할 수 있습니다. pgrep
명령어 역시 검색어를 허용하며, 검색어와 일치하는 각 프로세스의 PID를 출력합니다. pgrep
은 프로세스에 신호를 보내지 않으므로, 검색어를 잘못 입력하더라도 다른 프로세스를 실수로 종료할 위험이 없습니다. 이를 통해 pkill
명령어에 전달하기 전에 검색어가 올바른지 확인할 수 있습니다. pkill
과 pgrep
은 모두 검색어를 동일한 방식으로 처리하며, 두 명령어가 같은 매뉴얼 페이지를 공유하는 이유입니다.
예를 들어, 이름에 “subq”가 포함된 프로세스가 있다고 가정해 봅시다. ps -u dave | grep subq
명령어를 통해 해당 프로세스가 실제로 존재하는지, 그리고 해당 프로세스만 일치하는지 확인할 수 있습니다. 이것은 프로세스의 전체 이름을 확인하기 위한 예시입니다.
ps -u dave | grep subq
사용자가 프로세스 이름에 “subq” 문자열이 포함되어 있다는 것만 알고 있다고 가정해 봅시다. pgrep
을 사용하여 검색어와 일치하는 프로세스가 하나만 있는지 확인한 후, pkill
명령어를 사용하여 해당 프로세스를 종료할 수 있습니다.
pgrep subq
pkill subq
pkill
을 사용하면 여러 프로세스를 한 번에 종료할 수도 있습니다. 아래 예제에서는 사용자가 pgrep
을 사용하여 Chrome이 실행한 프로세스 수를 확인한 후, pkill
을 사용하여 해당 프로세스를 모두 종료합니다. 마지막으로 pgrep
을 다시 실행하여 모든 프로세스가 제거되었는지 확인합니다.
pgrep chrome
pkill chrome
pgrep chrome
만약 동일한 이름을 가진 여러 프로세스가 실행 중이지만, 그 중 일부만 종료하고 싶다면 pgrep
을 -f
(명령줄) 옵션과 함께 사용하여 각 프로세스를 구별할 수 있습니다. 예를 들어, 두 개의 ping
프로세스가 실행 중일 때, 특정 IP 주소를 대상으로 하는 ping
프로세스만 종료하고 싶은 경우 다음과 같이 할 수 있습니다. 명령줄 인수를 따옴표로 감싸야 함을 유의하십시오.
pgrep -f "ping 192.168.4.22"
pkill -f "ping 192.168.4.22"
killall
명령어의 주의점
경고: Solaris 및 OpenIndiana 운영 체제에서 killall
명령어는 사용자에게 속한 모든 프로세스를 종료할 수 있습니다. 만약 root
권한을 가지고 있거나 sudo killall
을 실행했다면, 시스템이 재부팅될 수 있습니다! 이 내용은 최신 버전의 OpenIndiana Hipster 2018.10에서도 확인되었습니다.
killall
명령어는 pkill
명령어와 유사하게 작동하지만, 몇 가지 중요한 차이점이 있습니다. killall
은 검색어가 아닌 정확한 프로세스 이름을 요구합니다.
프로세스 이름의 부분 일치를 허용하지 않으며, 다음과 같이 전체 프로세스 이름을 제공해야 합니다.
killall shutt
killall shutter
-y
(이하) 옵션을 사용하면 지정된 시간 미만 동안 실행된 프로세스를 종료할 수 있습니다. 기간은 다음 단위와 함께 숫자로 표시됩니다.
s (초)
m (분)
h (시간)
d (일)
w (주)
M (월, 대문자 “M” 사용)
y (년)
예를 들어, 방금 시작된 ana
라는 프로세스를 종료하고, 이전 인스턴스는 유지하고 싶다면, 2분 이내에 시작된 ana
프로세스만 종료하기 위해 다음과 같은 명령어를 사용할 수 있습니다.
killall -y 2m ana
-o
(이상) 옵션을 사용하면 지정된 시간 이상 실행된 프로세스를 종료할 수 있습니다. 예를 들어, 하루 이상 실행된 모든 ssh 연결을 종료하려면 다음 명령을 사용합니다.
killall -o 1d sshd
마무리
위에서 소개된 명령어들을 통해, 정확하고 안전하게 잘못된 프로세스를 식별하고 종료할 수 있습니다.
항상 주의를 기울이십시오. 첫째, 종료하려는 프로세스가 정말로 원하는 프로세스인지 확인하십시오. 둘째, 다시 한번 확인하십시오. 신중하게 대상을 확인하고, 확실해지면 프로세스 종료를 진행하십시오.