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

LinuxBeginner
지금 연습하기

소개

이번 실습에서는 Linux 시스템에서 프로세스를 관리하고 모니터링하는 데 필수적인 기술을 배웁니다. 포그라운드와 백그라운드에서 실행되는 프로세스와 상호 작용하는 방법을 익힘으로써, 명령줄 환경과 시스템 리소스를 더욱 효과적으로 제어할 수 있게 됩니다. 이 실습 경험은 시스템 관리자부터 개발자에 이르기까지 Linux를 다루는 모든 사람에게 기본이 되는 내용입니다.

먼저 & 연산자를 사용하여 백그라운드 작업을 시작하고 jobs로 그 상태를 확인하는 것부터 시작하겠습니다. 그런 다음 ps를 사용하여 실행 중인 프로세스를 검사하고, top으로 실시간 시스템 활동을 모니터링하며, fg, bg, 그리고 Ctrl-Z를 활용한 작업 제어를 실습합니다. 마지막으로 renice를 통해 프로세스의 우선순위를 조정하고 kill 명령어로 프로세스를 종료하는 방법을 배워 프로세스 관리의 전체 수명 주기를 완성합니다.

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

이번 단계에서는 명령을 백그라운드에서 실행하는 방법과 백그라운드 작업의 상태를 확인하는 방법을 배웁니다. Linux 셸에서는 일반적으로 명령을 실행하고 프롬프트가 반환될 때까지 완료를 기다립니다. 이를 *포그라운드(foreground)*에서 프로세스를 실행한다고 합니다. 하지만 실행 시간이 긴 작업의 경우, 터미널에서 다른 명령을 계속 사용할 수 있도록 *백그라운드(background)*에서 실행하는 것이 좋습니다.

백그라운드에서 명령을 실행하려면 명령줄 끝에 앰퍼샌드(&)를 추가하기만 하면 됩니다. 지정된 시간 동안 일시 중지하는 간단한 유틸리티인 sleep 명령으로 이를 시도해 보겠습니다.

백그라운드에서 sleep 300 명령을 300초 동안 실행하려면 다음 명령을 실행합니다. 이렇게 하면 다음 단계에서 이 프로세스를 다룰 수 있습니다.

sleep 300 &

Enter 키를 누르면 다음과 유사한 출력이 표시되며, 명령 프롬프트가 즉시 반환되어 새 명령을 입력할 수 있게 됩니다.

[1] 12345

셸이 sleep 300 명령을 백그라운드 작업으로 시작했습니다. 출력은 두 가지 핵심 정보를 제공합니다.

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

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

터미널에서 jobs 명령을 실행합니다.

jobs

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

[1]+  Running                 sleep 300 &

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

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

이번 단계에서는 ps 명령을 사용하여 실행 중인 프로세스를 검사합니다. 이전 단계에서는 jobs 명령을 사용하여 현재 셸의 백그라운드 프로세스를 확인했습니다. 그러나 jobs는 현재 세션으로 제한됩니다. 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를 사용할 수 있습니다. 매우 흔하고 유용한 조합은 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)가 처음 백그라운드에서 명령을 실행했을 때 본 것과 일치하는지 확인해 보세요.

프로세스를 보기 위한 또 다른 인기 있는 형식은 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을 입력하고 Enter를 누릅니다.

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)**은 가동 시간(uptime), 작업 수, CPU 부하(%Cpu(s)), 메모리 사용량(MiB Mem)과 같은 시스템 전체 통계를 보여줍니다.
  • 아래의 **프로세스 목록(process list)**은 기본적으로 CPU 사용량(%CPU)을 기준으로 정렬된 개별 프로세스를 보여줍니다.

top 명령은 대화형(interactive)입니다. 다양한 키 입력을 사용하여 동작을 변경할 수 있습니다. 몇 가지를 시도해 보겠습니다.

M(대문자 'm')을 눌러 메모리 사용량순으로 정렬합니다. 목록이 %MEM 열을 기준으로 다시 정렬되어 메모리를 가장 많이 사용하는 프로세스가 맨 위에 표시됩니다.

P(대문자 'p')를 눌러 CPU 사용량순으로 정렬합니다. 목록이 기본값인 %CPU 열 기준으로 다시 정렬됩니다.

앞서 시작한 sleep 프로세스를 찾아보세요. CPU를 사용하지 않기 때문에 목록 아래쪽에 있을 가능성이 큽니다. 아래쪽 화살표(Down Arrow)위쪽 화살표(Up Arrow) 키를 사용하여 프로세스 목록을 스크롤할 수 있습니다.

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

q를 눌러 top 인터페이스를 종료하고 명령 프롬프트로 돌아갑니다.

이제 top을 사용하여 시스템 프로세스와 리소스 사용량에 대한 실시간 뷰를 확인했습니다. 성능 문제를 해결하는 시스템 관리자에게 필수적인 명령어입니다.

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

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

앞서 시작한 sleep 300 프로세스로 실습해 보겠습니다. 먼저 jobs 명령으로 상태를 확인하여 여전히 실행 중인지 확인합니다.

jobs

백그라운드에서 실행 중인 sleep 작업이 표시되어야 합니다.

[1]  + running    sleep 300

이제 이 작업을 포그라운드로 가져와 보겠습니다. 이를 위해 작업 ID 앞에 %를 붙인 fg(foreground) 명령을 사용합니다. 작업 ID가 1이므로 명령은 다음과 같습니다.

fg %1

셸에 추가 작업 정보와 함께 명령 이름이 표시되고 명령 프롬프트가 사라집니다. 이제 터미널이 sleep 300 명령에 의해 "점유"되어 완료를 기다리게 됩니다.

[1]  + 394 running    sleep 300

프로세스를 종료하지 않고 터미널을 되찾으려면 프로세스를 *중지(stop)*하면 됩니다. 키 조합 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를 이용한 프로세스 우선순위 조절

이번 단계에서는 실행 중인 프로세스의 스케줄링 우선순위를 변경하는 방법을 배웁니다. Linux에서 프로세스의 "나이스 값(niceness)"은 다른 프로세스에 비해 얼마나 많은 CPU 시간을 얻을지를 결정합니다. nice 값은 -20(최고 우선순위)에서 +19(최저 우선순위)까지입니다. 기본적으로 대부분의 프로세스는 nice 값 0으로 시작합니다. nice 값이 높을수록 다른 프로세스에 대해 더 "친절(nice)"해져서 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를 사용해야 합니다.

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

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

<YOUR_PID>sleep 프로세스의 실제 PID로 바꿉니다. 예: ps -o pid,ni,cmd -p 23885.

    PID  NI CMD
  23885   0 sleep 300

예상대로 기본 nice 값(NI)은 0입니다.

이제 renice 명령을 사용하여 이 값을 변경해 보겠습니다. nice 값을 10으로 높여 프로세스의 우선순위를 낮추겠습니다. 일반 사용자는 자신의 프로세스 nice 값만 높일 수 있습니다(우선순위를 낮춤).

renice -n 10 -p <YOUR_PID>

마찬가지로 <YOUR_PID>를 프로세스의 PID로 바꿉니다. 명령은 이전 우선순위와 새 우선순위를 보고합니다.

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

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

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

출력에 새 nice 값이 표시되어야 합니다.

    PID  NI CMD
  23885  10 sleep 300

실행 중인 프로세스의 우선순위를 성공적으로 변경했습니다. 이는 오래 실행되는 중요하지 않은 백그라운드 작업이 더 중요한 포그라운드 작업을 방해하지 않도록 하는 유용한 기술입니다.

kill을 이용한 프로세스 종료

이번 단계에서는 프로세스를 종료하는 방법을 배웁니다. 일부 프로세스는 스스로 종료되지만, 더 이상 필요하지 않거나, 오작동하거나, 임시 목적(예: sleep 명령)으로 시작되어 수동으로 중지해야 하는 경우가 종종 있습니다. 이를 위한 주요 도구는 kill 명령입니다.

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

프로세스 ID(PID) 또는 현재 셸의 백그라운드 작업인 경우 작업 ID를 사용하여 타겟을 지정할 수 있습니다. 작업 ID를 사용하는 것이 더 편리한 경우가 많습니다.

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

jobs

sleep 프로세스가 나열되어야 합니다.

[1]+  Running                 sleep 300 &

이제 작업 ID(%1)와 함께 kill 명령을 사용하여 종료합니다.

kill %1

명령을 실행하면 셸이 작업이 종료되었음을 나타내는 메시지를 터미널에 출력할 것입니다. 이 메시지는 즉시 나타날 수도 있고 Enter 키를 다시 누른 후에 나타날 수도 있습니다.

[1]+  Terminated              sleep 300

프로세스가 실제로 사라졌는지 확인합니다. jobs 명령을 다시 실행합니다.

jobs

이 셸 세션에 더 이상 활성 작업이 없으므로 명령이 아무런 출력도 생성하지 않아야 합니다. ps를 사용하여 다시 한번 확인할 수도 있습니다.

ps aux | grep sleep

볼 수 있는 유일한 라인은 grep sleep 명령 자체여야 합니다. 원래의 sleep 300 프로세스는 더 이상 실행되고 있지 않습니다.

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

축하합니다! 이제 Linux에서 기본 프로세스 관리의 전체 수습 주기를 실습했습니다: 백그라운드에서 프로세스 시작, pstop으로 검사, 작업 제어로 관리, 우선순위 조정, 마지막으로 종료.

요약

이번 실습에서는 Linux 환경에서 프로세스를 관리하고 모니터링하는 데 필요한 핵심 기술을 배웠습니다. 먼저 & 연산자를 사용하여 백그라운드에서 프로세스를 실행하고 jobs 명령으로 상태를 확인했습니다. 그런 다음 프로세스 ID(PID)와 같은 세부 정보를 찾기 위해 ps로 실행 중인 모든 프로세스를 검사하는 방법과 시스템 리소스 사용량 및 활성 프로세스를 실시간으로 모니터링하기 위해 top을 사용하는 방법을 살펴보았습니다.

또한 Ctrl-Z로 포그라운드 프로세스를 일시 중지하고, bg로 백그라운드로 이동시키며, fg로 포그라운드로 다시 가져오는 작업 제어를 실습했습니다. 아울러 renice를 사용하여 프로세스의 스케줄링 우선순위를 조정하는 방법과 PID와 함께 kill 명령을 사용하여 프로세스를 정상적으로 종료하는 방법을 배웠습니다.