리눅스의 터미널에서 실행중인 프로세스를 종료시키기 위한 몇 가지 방법이 있습니다. 가장 쉬운 방법은 터미널 창을 종료시켜버리는 것입니다만, 몇 가지 단축키들을 익혀두면 유용하게 활용할 수 있습니다.
- Ctrl + C: SIGINT 시그널 전달
- Ctrl + D: 입력 종료, EOF 문자
- Ctrl + Z: SIGTSTP 시그널 전달
- Ctrl + \: SIGQUIT 시그널 전달
Ctrl + C: SIGINT 시그널 전달
Ctrl + C는 현재 실행중인 프로세스에 SIGINT 시그널을 전달하는 단축키입니다. SIGINT 시그널은 Interrupt를 의미하며, 프로세스를 종료하는 용도로 주로 사용됩니다. Ctr + C는 리눅스 상에서는 ^C로 표기하는 경우가 많습니다.
다음과 같이 sleep 100 명령어를 실행하면 100초간 대기하고 프로세스가 종료됩니다. 프로세스가 종료되기 전에 Ctrl + C를 입력하면 그 즉시 셸로 돌아갑니다.
$ sleep 100
^C
$
프로세스 아이디를 알고 있다면, 다른 셸에서 다음과 같이 실행하는 것과 같습니다.
$ kill -2 <PID>
SIGINT는 SIGKILL에 비해서는 비교적 안전한 종료 방법입니다. 앞에서 이야기한대로 프로세스를 종료하기 전에 정리하는 단계를 거치기 때문에, 프로세스에 따라서 종료까지 시간이 걸릴 수 있습니다. 간혹 SIGINT 명령어를 무시하는 경우도 있습니다. Ctrl + C는 리눅스 환경에서 프로세스 종료 뿐만 아니라, 작업을 중단하는 용도로 사용되는 관습적인 단축키이기도 하니 꼭 기억해주세요.
Ctrl + D: 입력 종료, EOF 입력
가끔은 터미널에서 실행중인 프로세스를 종료할 때 Ctrl + D를 사용하기도 합니다. 그런데 이 단축키는 시그널을 보내는 것과는 조금 차이가 있습니다. 이 단축키는 EOF, 즉 End of File을 입력합니다. 이는 프로세스에게 입력이 종료되었다는 의미를 전달합니다. 예를 들어보겠습니다.
cat 명령어는 인자 없이 실행하면, 입력한 내용을 그대로 출력합니다. 여기서 <ENTER>는 엔터키 입력을 의미합니다.
$ cat
Hello<ENTER>
Hello
World<ENTER>
World
^C
Hello를 입력하고 엔터를 입력하면 Hello가 출력됩니다. World를 입력하고 엔터를 입력하면 World가 출력됩니다. ^C를 입력해서 종료할 수 있습니다. 이번에는 ^D를 사용해보겠습니다.
$ cat
Hello^DHello
Hello를 입력하고 ^D를 입력하면, 바로 이어서 Hello가 출력됩니다. 단, ^C와 달리 ^D가 실제로 출력되지는 않습니다. 이렇게 동작하는 이유는 엔터 입력과 마찬가지로 ^D가 여기까지가 입력의 끝인 것을 알려주기 때문입니다. 반면에 문자를 입력하지 않은 상태에서 ^D를 입력하면 더 이상 입력이 없다고 판단하고 프로세스가 그대로 종료됩니다.
$ cat
^D
$
다른 예제를 살펴보겠습니다. sleep을 실행하고 ^D를 입력해봅니다.
$ sleep 100
^D
아무런 반응이 없습니다. sleep과 같이 입력을 처리하는 프로세스가 아닌 경우 EOF를 입력해도 아무런 처리가 일어나지 않습니다. 입력을 처리하는 프로세스인지, 아닌지 이 차이를 구분해서 사용하면 ^D도 프로세스를 종료할 때 사용할 수 있습니다. 단, 정확한 의미는 입력이 종료되었다는 것을 알리는 단축키라는 걸 기억해주세요.
터미널에서 가장 많이 사용하는 셸도 입력을 처리하는 명령어입니다. 셸도 ^D로 종료할 수 있으니 참고해주세요.
Ctrl + Z: SIGTSTP 시그널 전달
프로세스 종료에 활용할 수 있는 또 다른 단축키는 Ctrl + Z입니다. 이 단축키는 특히 활용도가 높습니다. ^Z는 ^C와 비슷하게 프로세스에 SIGTSTP 시그널을 전달합니다. 앞에서 살펴보았듯이 ^C와 ^D는 상황에 따라서 의도한대로 동작하지 않는 경우가 있습니다만, Ctrl + Z는 거의 모든 경우 프로세스를 즉시 중지시킵니다. 예를 들어 vi 실행중에 ^Z를 입력하면 곧바로 프로세스가 중지됩니다.
$ vi
^Z
[1]+ Stopped vi
출력에서 알 수 있듯이 vi 프로세스가 중지(Stopped) 상태로 백그라운드로 보내집니다. 현재 셸에서 중지된 프로세스는 jobs 명령어로 확인할 수 있습니다.
$ jobs
[1]+ Stopped vi
이렇게 중지해둔 프로세스는 fg 명령어로 다시 실행중이던 상태로 되돌아갈 수도 있습니다. 앞의 숫자가 아이디라고 생각할 수 있습니다. fg 혹은 fg %1을 실행하면 vi 프로세스로 되돌아갑니다. 여기서 fg는 포그라운드의 줄임말이고, %1은 1번 잡을 의미합니다.
중지된 프로세스를 종료하고자할 때는 kill 명령어를 사용할 수 있습니다. 다음 명령어로 SIGTERM 시그널을 전달합니다. % 뒤에 잡 아이디를 붙여줍니다.
$ kill %1
[1]+ Stopped vi
Ctrl + Z는 프로세스를 즉시 중단할 수 있고, 다시 살릴 수도 있다는 점에서 활용도가 높습니다.
여기까지 터미널에서 프로세스를 종료하는 단축키들에 대해서 알아보았습니다.