리눅스 프로세스 관리 및 모니터링

CompTIABeginner
지금 연습하기

소개

이 실습에서는 리눅스 시스템에서 프로세스를 관리하고 모니터링하는 데 필요한 핵심 기술을 습득합니다. 포그라운드와 백그라운드에서 실행되는 프로세스를 제어하는 방법을 탐구함으로써, 커맨드 라인 환경과 시스템 리소스를 더욱 효율적으로 관리할 수 있게 됩니다. 이러한 실무 경험은 시스템 관리자부터 개발자에 이르기까지 리눅스를 다루는 모든 이들에게 필수적인 기초 역량입니다.

먼저 & 연산자를 사용하여 백그라운드 작업을 시작하고 jobs 명령어로 상태를 확인하는 것부터 시작합니다. 이어서 ps로 실행 중인 프로세스를 상세히 조사하고, top을 통해 실시간 시스템 활동을 모니터링하며, fg, bg, Ctrl-Z를 활용한 작업 제어 (Job Control) 를 연습합니다. 실습의 마지막 단계에서는 renice를 사용하여 프로세스의 우선순위를 조정하고 kill 명령어로 프로세스를 종료하는 방법까지, 프로세스 관리의 전체 생명주기를 다루게 됩니다.

&jobs 를 이용한 백그라운드 프로세스 시작 및 확인

이 단계에서는 명령어를 백그라운드에서 실행하는 방법과 백그라운드 작업의 상태를 확인하는 방법을 배웁니다. 리눅스 셸에서는 보통 명령어를 실행하고 해당 작업이 완료될 때까지 기다린 후에야 다시 프롬프트가 나타납니다. 이를 *포그라운드 (foreground)*에서 프로세스를 실행한다고 합니다. 하지만 시간이 오래 걸리는 작업의 경우, 터미널에서 다른 명령어를 계속 입력할 수 있도록 *백그라운드 (background)*에서 실행하는 것이 효율적입니다.

명령어를 백그라운드에서 실행하려면 명령어 끝에 앰퍼샌드 (&) 를 붙이기만 하면 됩니다. 지정된 시간 동안 대기하는 간단한 유틸리티인 sleep 명령어로 이를 테스트해 보겠습니다.

다음 명령어를 실행하여 sleep 프로세스를 300 초 동안 백그라운드에서 실행하십시오. 이를 통해 다음 단계에서 해당 프로세스를 제어해 볼 수 있습니다.

sleep 300 &

엔터를 누르면 다음과 유사한 출력이 표시되며, 명령 프롬프트가 즉시 다시 나타나 새로운 명령어를 입력할 수 있는 상태가 됩니다.

[1] 12345

셸이 sleep 300 명령어를 백그라운드 작업으로 시작했습니다. 출력된 내용에는 두 가지 중요한 정보가 포함되어 있습니다.

  • [1]: **작업 ID(Job ID)**입니다. 셸은 각 백그라운드 프로세스에 고유한 작업 ID 를 할당합니다.
  • 12345: **프로세스 ID(PID)**입니다. 운영체제는 실행 중인 모든 프로세스에 고유한 PID 를 부여합니다. 실제 실습 환경에서의 PID 는 예시와 다를 것입니다.

이제 프로세스가 백그라운드에서 실행 중인데, 상태를 어떻게 확인할 수 있을까요? 현재 셸 세션의 백그라운드에서 실행 중인 모든 작업을 나열하는 jobs 명령어를 사용하면 됩니다.

터미널에 jobs 명령어를 입력해 보세요.

jobs

방금 시작한 sleep 명령어와 함께 작업 ID 및 현재 상태가 출력됩니다.

[1]+  Running                 sleep 300 &

성공적으로 프로세스를 백그라운드에서 시작하고 상태를 확인하는 방법을 익혔습니다. 이는 리눅스 시스템에서 장시간 실행되는 작업을 관리하는 데 필수적인 기술입니다. 다음 단계에서는 이 백그라운드 작업과 상호작용하는 방법을 알아보겠습니다.

ps 를 이용한 실행 중인 프로세스 조사

이전 단계에서는 jobs 명령어를 사용하여 현재 셸의 백그라운드 프로세스를 확인했습니다. 하지만 jobs는 현재 세션으로 범위가 제한됩니다. 시스템에서 실행 중인 모든 프로세스를 더 넓은 관점에서 보려면 더 강력한 도구인 ps(process status) 가 필요합니다. ps 명령어는 실행하는 시점의 프로세스 현황을 스냅샷 형태로 제공합니다.

먼저 옵션 없이 ps를 실행해 보겠습니다. 이 명령어는 현재 사용자가 소유하고 현재 터미널에 연결된 프로세스의 스냅샷을 보여줍니다.

ps

출력 결과는 매우 간결하며, 아마도 현재 사용 중인 셸 (zsh) 과 방금 실행한 ps 명령어만 표시될 것입니다. PID 는 시스템마다 다르게 나타납니다.

  PID TTY          TIME CMD
23882 pts/0    00:00:00 zsh
23953 pts/0    00:00:00 ps

터미널에 연결된 것뿐만 아니라 시스템에서 실행 중인 모든 프로세스를 확인하려면 옵션을 추가해야 합니다. 가장 흔히 사용되는 유용한 조합은 ps aux입니다.

  • a: 모든 사용자의 프로세스를 표시합니다.
  • u: 사용자 중심 형식으로 표시합니다 (사용자, CPU%, MEM% 등 포함).
  • x: 터미널에 연결되지 않은 프로세스까지 포함합니다.

프로세스 목록이 너무 길면 특정 프로세스를 찾기 어렵습니다. 이럴 때는 psgrep 명령어를 조합하여 결과를 필터링할 수 있습니다. 이전 단계에서 시작한 sleep 프로세스를 찾아보겠습니다.

ps aux | grep sleep

이 명령어는 ps aux의 출력 결과에서 "sleep"이라는 단어가 포함된 줄만 골라내어 보여줍니다.

labex    23885  0.0  0.0   7264   868 pts/0    S    11:50   0:00 sleep 300
labex    23962  0.0  0.0  10788  2240 pts/0    S+   11:52   0:00 grep --color=auto sleep

출력에는 보통 두 줄이 표시됩니다. 하나는 sleep 300 프로세스이고, 다른 하나는 ps가 프로세스 목록을 캡처하는 순간 실행 중이었던 grep sleep 명령어 자체입니다. sleep 300의 PID(이 예시에서는 23885) 가 처음에 백그라운드로 실행했을 때 확인한 PID 와 일치하는지 확인해 보세요.

프로세스를 확인하는 또 다른 대중적인 형식은 ps -ef입니다.

  • -e: 시스템의 모든 프로세스를 선택합니다.
  • -f: 부모 프로세스 ID(PPID) 와 같은 유용한 정보를 포함하는 "전체 (full)" 형식으로 리스트를 표시합니다.

다시 한번 grep을 사용하여 sleep 프로세스를 찾아보겠습니다.

ps -ef | grep sleep

출력 형식은 다르지만 유사한 정보를 제공합니다. 이 뷰는 특히 PIDPPID 열을 통해 프로세스 간의 계층 구조를 파악하는 데 유용합니다.

UID        PID  PPID  C STIME TTY          TIME CMD
labex    23885 23882  0 11:50 pts/0    00:00:00 sleep 300
labex    23964 23882  0 11:53 pts/0    00:00:00 grep --color=auto sleep

지금까지 ps를 사용하여 시스템 프로세스의 스냅샷을 얻는 방법을 살펴보았습니다. grep과 같은 도구와 결합하면 특정 프로세스를 신속하게 찾아내고 조사할 수 있습니다.

top 을 이용한 시스템 리소스 모니터링

이 단계에서는 실시간 시스템 모니터링을 위한 강력한 도구인 top의 사용법을 배웁니다. ps가 프로세스의 정적인 스냅샷을 제공한다면, top은 시스템 활동을 동적으로 계속 업데이트하여 보여줍니다. 이는 리소스를 많이 점유하는 프로세스를 즉각적으로 식별하는 데 매우 유용합니다.

시작하려면 터미널에 top을 입력하고 엔터를 누르십시오.

top

터미널 창 전체가 top 인터페이스로 전환됩니다. 데이터는 몇 초마다 자동으로 갱신되며 다음과 같은 모습으로 나타납니다.

top - 12:05:15 up 15 min,  1 user,  load average: 0.00, 0.01, 0.00
Tasks: 115 total,   1 running, 114 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1987.2 total,    985.4 free,    501.8 used,    500.0 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   1325.4 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0  167900  12936   8488 S   0.0   0.6   0:01.15 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd
...

top 인터페이스는 크게 두 부분으로 나뉩니다.

  • 상단의 요약 영역 (Summary area): 시스템 가동 시간, 작업 수, CPU 부하 (%Cpu(s)), 메모리 사용량 (MiB Mem) 등 시스템 전반의 통계를 보여줍니다.
  • 하단의 프로세스 목록 (Process list): 개별 프로세스를 보여주며, 기본적으로 CPU 사용량 (%CPU) 순으로 정렬됩니다.

top 명령어는 대화형 도구입니다. 특정 키를 눌러 동작을 변경할 수 있습니다. 다음 몇 가지를 시도해 보세요.

  1. 메모리 사용량순 정렬: 대문자 M을 누르세요. 목록이 %MEM 열을 기준으로 재정렬되어 메모리를 가장 많이 사용하는 프로세스가 상단에 표시됩니다.
  2. CPU 사용량순 정렬: 대문자 P를 누르세요. 목록이 다시 기본값인 %CPU 열 기준으로 정렬됩니다.
  3. sleep 프로세스 찾기: 이전에 시작한 sleep 프로세스를 찾아보세요. CPU 를 거의 사용하지 않기 때문에 목록 하단에 있을 가능성이 높습니다. 아래쪽 화살표위쪽 화살표 키를 사용하여 프로세스 목록을 스크롤할 수 있습니다.

관찰을 마쳤다면 언제든지 top을 종료할 수 있습니다.

  1. top 종료: q를 눌러 top 인터페이스를 빠져나와 명령 프롬프트로 돌아갑니다.

이제 top을 사용하여 시스템 프로세스와 리소스 사용 현황을 실시간으로 확인하는 방법을 익혔습니다. 이는 성능 문제를 해결하려는 시스템 관리자에게 가장 기본이 되는 명령어입니다.

fg, bg, Ctrl-Z 를 이용한 작업 제어

이 단계에서는 실행 중인 작업의 상태를 관리하는 방법을 배웁니다. 이미 백그라운드에서 작업을 시작하는 방법은 알고 있지만, 만약 포그라운드에서 긴 작업을 시작했다가 터미널을 계속 사용해야 한다는 것을 깨달았다면 어떻게 해야 할까요? 작업 제어 (Job control) 기능을 사용하면 프로세스를 포그라운드와 백그라운드 사이에서 이동시키거나, 일시 중지 (stop) 및 재개할 수 있습니다.

이전에 시작한 sleep 300 프로세스를 활용해 보겠습니다. 먼저 jobs 명령어로 해당 프로세스가 여전히 실행 중인지 확인합니다.

jobs

백그라운드에서 실행 중인 sleep 작업이 보여야 합니다.

[1]  + running    sleep 300

이제 이 작업을 포그라운드로 가져오겠습니다. 이를 위해 fg(foreground) 명령어 뒤에 %와 작업 ID 를 붙여 입력합니다. 작업 ID 가 1이므로 명령어는 다음과 같습니다.

fg %1

셸에 추가적인 작업 정보와 함께 명령어 이름이 표시되고, 명령 프롬프트가 사라집니다. 이제 터미널은 sleep 300 명령어가 끝날 때까지 "점유"된 상태가 됩니다.

[1]  + 394 running    sleep 300

프로세스를 강제로 종료하지 않고 터미널 제어권을 다시 가져오려면 프로세스를 일시 중지하면 됩니다. Ctrl-Z 키 조합 (Ctrl 키를 누른 상태에서 Z 키를 누름) 을 입력하세요.

이 동작은 프로세스에 특별한 신호 (SIGTSTP) 를 보내 실행을 일시 정지시킵니다. 프로세스가 종료된 것이 아니라 단지 중단된 상태입니다. 확인 메시지가 표시되고 프롬프트가 다시 나타납니다.

[1]  + 394 suspended  sleep 300

이제 작업 상태를 다시 확인해 보세요.

jobs

출력 결과에 작업 상태가 "suspended"(중단됨) 로 표시됩니다.

[1]  + suspended  sleep 300

중단된 작업은 다시 재개할 수 있습니다. fg를 사용하여 포그라운드에서 재개하거나, bg를 사용하여 백그라운드에서 재개할 수 있습니다. bg 명령어를 사용하여 백그라운드에서 재개해 보겠습니다.

bg %1

셸은 해당 작업이 이제 다시 백그라운드에서 실행 중임을 확인해 줍니다.

[1]  + 394 continued  sleep 300

마지막으로 jobs를 한 번 더 실행하여 상태가 다시 "Running"으로 돌아왔는지 확인합니다. 이제 프로세스를 백그라운드에서 포그라운드로 가져오고, 중단시킨 후, 다시 백그라운드에서 재개하는 모든 과정을 성공적으로 수행했습니다.

renice 를 이용한 프로세스 우선순위 조정

이 단계에서는 실행 중인 프로세스의 스케줄링 우선순위에 영향을 주는 방법을 배웁니다. 리눅스에서 프로세스의 "나이스 (niceness)" 값은 다른 프로세스와 비교하여 CPU 시간을 얼마나 할당받을지를 결정합니다. 나이스 값은 -20(가장 높은 우선순위) 에서 +19(가장 낮은 우선순위) 사이의 범위를 가집니다. 기본적으로 대부분의 프로세스는 나이스 값 0 으로 시작합니다. 나이스 값이 높을수록 다른 프로세스에 CPU 시간을 더 잘 양보한다는 의미에서 "나이스 (친절)"하다고 표현합니다.

우리가 계속 다루고 있는 sleep 프로세스의 우선순위를 조정해 보겠습니다. 이를 위해 먼저 프로세스 ID(PID) 가 필요합니다. psgrep을 사용하여 다시 찾아보겠습니다.

ps aux | grep sleep

sleep 300에 해당하는 줄 (grep 명령어 자체 제외) 을 찾고 두 번째 열에 있는 PID 를 기록하세요.

labex    23885  0.0  0.0   7264   868 pts/0    S    11:50   0:00 sleep 300
labex    24101  0.0  0.0  10788  2240 pts/0    S+   12:15   0:00 grep --color=auto sleep

이 예시에서 PID 는 23885입니다. 다음 명령어들을 입력할 때는 반드시 본인의 출력 결과에 나온 PID 를 사용해야 합니다.

이제 프로세스의 현재 나이스 값 (NI) 을 확인해 보겠습니다. ps 명령어에 -o 옵션을 사용하면 원하는 출력 열을 지정할 수 있습니다.

ps -o pid,ni,cmd -p <YOUR_PID>

<YOUR_PID> 부분을 실제 sleep 프로세스의 PID 로 바꾸세요. 예: ps -o pid,ni,cmd -p 23885.

    PID  NI CMD
  23885   5 sleep 300

예상대로 기본 나이스 값 (NI) 이 5 로 표시됩니다.

이제 renice 명령어를 사용하여 이 값을 변경해 보겠습니다. 나이스 값을 10으로 높여 프로세스의 우선순위를 낮추겠습니다. 일반 사용자는 자신이 소유한 프로세스의 나이스 값만 높일 수 있습니다 (즉, 우선순위를 낮추는 것만 가능).

renice -n 10 -p <YOUR_PID>

마찬가지로 <YOUR_PID>를 본인의 PID 로 바꿉니다. 명령어 실행 후 이전 우선순위와 새 우선순위가 보고됩니다.

23885 (process ID) old priority 5, new priority 10

마지막으로 ps 명령어를 다시 실행하여 변경 사항이 적용되었는지 확인합니다.

ps -o pid,ni,cmd -p <YOUR_PID>

출력 결과에 새로운 나이스 값이 표시되어야 합니다.

    PID  NI CMD
  23885  10 sleep 300

실행 중인 프로세스의 우선순위를 성공적으로 변경했습니다. 이 기법은 시간이 오래 걸리지만 중요하지 않은 백그라운드 작업이 중요한 포그라운드 작업을 방해하지 않도록 할 때 유용합니다.

kill 을 이용한 프로세스 종료

마지막 단계에서는 프로세스를 종료하는 방법을 배웁니다. 어떤 프로세스는 스스로 종료되기도 하지만, 더 이상 필요하지 않거나 오작동하는 프로세스, 또는 실습용 sleep 명령어처럼 임시로 시작한 프로세스는 수동으로 중단시켜야 할 때가 많습니다. 이를 위한 주요 도구가 바로 kill 명령어입니다.

kill 명령어는 지정된 프로세스에 신호 (signal) 를 보냅니다. 기본적으로 SIGTERM(종료) 신호를 보내는데, 이는 프로세스에 종료를 정중하게 요청하여 프로세스가 종료 전 정리 작업을 수행할 수 있도록 합니다.

프로세스 ID(PID) 를 사용하거나, 현재 셸의 백그라운드 작업인 경우 작업 ID 를 사용하여 대상을 지정할 수 있습니다. 작업 ID 를 사용하는 것이 종종 더 편리합니다.

먼저 sleep 작업이 여전히 실행 중인지 확인합니다.

jobs

목록에 sleep 프로세스가 보여야 합니다.

[1]+  Running                 sleep 300 &

이제 작업 ID(%1) 와 함께 kill 명령어를 사용하여 프로세스를 종료합니다.

kill %1

명령어를 실행한 후, 셸은 해당 작업이 종료되었음을 알리는 메시지를 출력합니다. 이 메시지는 즉시 나타나거나 엔터를 한 번 더 눌렀을 때 나타날 수 있습니다.

[1]+  Terminated              sleep 300

프로세스가 완전히 사라졌는지 확인하기 위해 jobs 명령어를 다시 실행합니다.

jobs

현재 셸 세션에 활성 작업이 없으므로 아무런 출력도 나오지 않아야 합니다. ps로도 교차 확인해 볼 수 있습니다.

ps aux | grep sleep

grep sleep 명령어 자체를 제외하고는 아무것도 검색되지 않아야 합니다. 원래의 sleep 300 프로세스는 더 이상 실행 중이 아닙니다.

만약 프로세스가 응답하지 않아 기본 SIGTERM 신호에 반응하지 않는 경우, 더 강력한 신호인 SIGKILL(신호 번호 9) 을 보낼 수 있습니다. 이는 프로세스에 정리할 기회를 주지 않고 즉시 강제 종료시킵니다. 명령어는 kill -9 %1 형식이 되며, 이는 최후의 수단으로 사용해야 합니다.

축하합니다! 리눅스 프로세스 관리의 전체 생명주기를 실습했습니다. 백그라운드에서 프로세스 시작, pstop을 이용한 조사, 작업 제어를 통한 관리, 우선순위 조정, 그리고 마지막으로 종료까지 모든 과정을 마쳤습니다.

요약

이 실습에서는 리눅스 환경에서 프로세스를 관리하고 모니터링하는 기본적인 기술을 습득했습니다. & 연산자를 사용하여 백그라운드에서 프로세스를 실행하고 jobs 명령어로 상태를 확인하는 것부터 시작했습니다. 이어서 ps를 통해 프로세스 ID(PID) 와 같은 상세 정보를 찾고, top을 사용하여 시스템 리소스 사용량과 활성 프로세스를 실시간으로 모니터링하는 방법을 살펴보았습니다.

또한 Ctrl-Z로 포그라운드 프로세스를 중단하고, bg로 백그라운드로 이동시키며, fg로 다시 포그라운드로 가져오는 작업 제어 과정을 연습했습니다. 마지막으로 renice를 사용하여 프로세스의 스케줄링 우선순위를 조정하고, kill 명령어와 PID 를 사용하여 프로세스를 안전하게 종료하는 방법까지 학습했습니다.