웹사이트 검색

ps, kill 및 nice를 사용하여 Linux에서 프로세스를 관리하는 방법


소개

최신 컴퓨터와 마찬가지로 Linux 서버는 여러 애플리케이션을 실행합니다. 이들은 개별 프로세스로 참조되고 관리됩니다.

Linux는 프로세스의 수명 주기(예: 시작, 종료, 메모리 할당 등)에서 낮은 수준의 배후 관리를 처리하지만 운영 체제와 상호 작용하여 프로세스를 관리하는 방법이 필요합니다. 더 높은 수준.

이 가이드에서는 프로세스 관리의 몇 가지 기본적인 측면을 배웁니다. Linux는 이러한 목적을 위해 다양한 표준 내장 도구를 제공합니다.

Ubuntu 20.04 환경에서 이러한 아이디어를 살펴보겠지만 모든 최신 Linux 배포판은 비슷한 방식으로 작동합니다.

1단계 - Linux에서 실행 중인 프로세스를 보는 방법

top 명령을 사용하여 서버에서 실행 중인 모든 프로세스를 볼 수 있습니다.

  1. top
Output
top - 15:14:40 up 46 min, 1 user, load average: 0.00, 0.01, 0.05 Tasks: 56 total, 1 running, 55 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1019600k total, 316576k used, 703024k free, 7652k buffers Swap: 0k total, 0k used, 0k free, 258976k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/0 6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 7 root RT 0 0 0 0 S 0.0 0.0 0:00.03 watchdog/0 8 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 cpuset 9 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper 10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs

출력의 처음 몇 줄은 CPU/메모리 로드 및 실행 중인 총 작업 수와 같은 시스템 통계를 제공합니다.

1개의 실행 중인 프로세스와 능동적으로 CPU 주기를 사용하지 않기 때문에 수면 상태로 간주되는 55개의 프로세스가 있음을 알 수 있습니다.

표시된 출력의 나머지 부분에는 실행 중인 프로세스와 해당 사용 통계가 표시됩니다. 기본적으로 top은 CPU 사용량별로 자동으로 정렬하므로 가장 바쁜 프로세스를 먼저 볼 수 있습니다. topCtrl+C의 표준 키 조합을 사용하여 실행 중인 프로세스를 종료할 때까지 셸에서 계속 실행됩니다. 이것은 kill 신호를 보내 프로세스가 가능한 경우 정상적으로 중지하도록 지시합니다.

htop이라고 하는 top의 개선된 버전은 대부분의 패키지 저장소에서 사용할 수 있습니다. Ubuntu 20.04에서는 apt를 사용하여 설치할 수 있습니다.

  1. sudo apt install htop

그런 다음 htop 명령을 사용할 수 있습니다.

  1. htop
Output
Mem[||||||||||| 49/995MB] Load average: 0.00 0.03 0.05 CPU[ 0.0%] Tasks: 21, 3 thr; 1 running Swp[ 0/0MB] Uptime: 00:58:11 PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command 1259 root 20 0 25660 1880 1368 R 0.0 0.2 0:00.06 htop 1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 /sbin/init 311 root 20 0 17224 636 440 S 0.0 0.1 0:00.07 upstart-udev-brid 314 root 20 0 21592 1280 760 S 0.0 0.1 0:00.06 /sbin/udevd --dae 389 messagebu 20 0 23808 688 444 S 0.0 0.1 0:00.01 dbus-daemon --sys 407 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.02 rsyslogd -c5 408 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.00 rsyslogd -c5 409 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.00 rsyslogd -c5 406 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.04 rsyslogd -c5 553 root 20 0 15180 400 204 S 0.0 0.0 0:00.01 upstart-socket-br

htop은 여러 CPU 스레드의 더 나은 시각화, 최신 터미널의 색상 지원에 대한 더 나은 인식, 더 많은 정렬 옵션 등을 제공합니다. top과 달리 기본적으로 항상 설치되는 것은 아니지만 드롭인 교체로 간주할 수 있습니다. top에서와 같이 Ctrl+C를 눌러 htop을 종료할 수 있습니다. top 및 htop 사용 방법에 대해 자세히 알아볼 수도 있습니다.

다음 섹션에서는 도구를 사용하여 특정 프로세스를 쿼리하는 방법에 대해 알아봅니다.

2단계 – ps를 사용하여 프로세스를 나열하는 방법

tophtop은 그래픽 작업 관리자와 유사하게 실행 중인 프로세스를 볼 수 있는 대시보드 인터페이스를 제공합니다. 대시보드 인터페이스는 개요를 제공할 수 있지만 일반적으로 직접 실행 가능한 출력을 반환하지 않습니다. 이를 위해 Linux는 실행 중인 프로세스를 쿼리하기 위해 ps라는 또 다른 표준 명령을 제공합니다.

인수 없이 ps를 실행하면 정보가 거의 제공되지 않습니다.

  1. ps
Output
PID TTY TIME CMD 1017 pts/0 00:00:00 bash 1262 pts/0 00:00:00 ps

이 출력은 현재 사용자 및 터미널 세션과 관련된 모든 프로세스를 보여줍니다. 이것은 현재 이 터미널 내에서 bash 셸과 이 ps 명령만 실행 중인 경우에 적합합니다.

이 시스템의 프로세스에 대한 보다 완전한 그림을 보려면 ps aux를 실행할 수 있습니다.

  1. ps aux
Output
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 24188 2120 ? Ss 14:28 0:00 /sbin/init root 2 0.0 0.0 0 0 ? S 14:28 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 14:28 0:00 [ksoftirqd/0] root 6 0.0 0.0 0 0 ? S 14:28 0:00 [migration/0] root 7 0.0 0.0 0 0 ? S 14:28 0:00 [watchdog/0] root 8 0.0 0.0 0 0 ? S< 14:28 0:00 [cpuset] root 9 0.0 0.0 0 0 ? S< 14:28 0:00 [khelper] …

이러한 옵션은 ps에 모든 사용자가 소유한 프로세스(터미널 연결에 관계없이)를 사람이 더 읽기 쉬운 형식으로 표시하도록 지시합니다.

파이프를 사용하면 특정 프로세스의 이름을 반환하기 위해 grep을 사용하여 ps aux의 출력 내에서 검색할 수 있습니다. 충돌이 발생했다고 생각하거나 어떤 이유로 중지해야 하는 경우에 유용합니다.

  1. ps aux | grep bash
Output
sammy 41664 0.7 0.0 34162880 2528 s000 S 1:35pm 0:00.04 -bash sammy 41748 0.0 0.0 34122844 828 s000 S+ 1:35pm 0:00.00 grep bash

이것은 방금 실행한 grep 프로세스와 현재 실행 중인 bash 셸을 모두 반환합니다. 또한 총 메모리 및 CPU 사용량, 실행 시간, 위의 강조 표시된 출력에서 프로세스 ID를 반환합니다. Linux 및 Unix 계열 시스템에서 각 프로세스에는 프로세스 ID 또는 PID가 할당됩니다. 이것은 운영 체제가 프로세스를 식별하고 추적하는 방법입니다.

프로세스의 PID를 얻는 빠른 방법은 pgrep 명령을 사용하는 것입니다.

  1. pgrep bash
Output
1017

init이라고 하는 부팅 시 생성되는 첫 번째 프로세스에는 PID "1\이 지정됩니다.

  1. pgrep init
Output
1

이 프로세스는 시스템의 다른 모든 프로세스 생성을 담당합니다. 이후 프로세스에는 더 큰 PID 번호가 부여됩니다.

프로세스의 부모는 생성을 담당한 프로세스입니다. 상위 프로세스에는 top, htopps를 비롯한 많은 프로세스 관리 애플리케이션의 열 헤더에서 볼 수 있는 PPID가 있습니다.

프로세스에 대한 사용자와 운영 체제 간의 통신에는 작업 중 어느 시점에서 프로세스 이름과 PID 간의 변환이 포함됩니다. 이것이 이러한 유틸리티가 출력에 항상 PID를 포함하는 이유입니다. 다음 섹션에서는 PID를 사용하여 중지, 재개 또는 기타 신호를 실행 중인 프로세스에 보내는 방법을 배웁니다.

3단계 - Linux에서 프로세스 신호를 보내는 방법

Linux의 모든 프로세스는 신호에 응답합니다. 신호는 동작을 종료하거나 수정하도록 프로그램에 지시하는 운영 체제 수준의 방법입니다.

신호를 프로그램에 전달하는 가장 일반적인 방법은 kill 명령을 사용하는 것입니다. 예상할 수 있듯이 이 유틸리티의 기본 기능은 프로세스 종료를 시도하는 것입니다.

  1. kill PID_of_target_process

그러면 TERM 신호가 프로세스에 전송됩니다. TERM 신호는 프로세스를 종료하라고 알려줍니다. 이렇게 하면 프로그램이 정리 작업을 수행하고 원활하게 종료할 수 있습니다.

프로그램이 오작동하고 TERM 신호가 주어졌을 때 종료되지 않는 경우 KILL 신호를 전달하여 신호를 확대할 수 있습니다.

  1. kill -KILL PID_of_target_process

이것은 프로그램에 전송되지 않는 특수 신호입니다.

대신 프로세스를 종료하는 운영 체제 커널에 제공됩니다. 이것은 전송된 신호를 무시하는 프로그램을 우회하는 데 사용됩니다.

각 신호에는 이름 대신 전달할 수 있는 관련 번호가 있습니다. 예를 들어 "-TERM\ 대신 "-15\를, "-KILL\ 대신 "-9\를 전달할 수 있습니다.

신호는 프로그램을 종료하는 데만 사용되는 것이 아닙니다. 다른 작업을 수행하는 데 사용할 수도 있습니다.

예를 들어, 백그라운드에서 계속 실행되도록 설계된 많은 프로세스("데몬\이라고도 함)는 HUP 또는 중단이 주어지면 자동으로 다시 시작됩니다. Apache 웹서버는 일반적으로 이러한 방식으로 작동합니다.

  1. sudo kill -HUP pid_of_apache

위의 명령은 Apache가 구성 파일을 다시 로드하고 콘텐츠 제공을 재개하도록 합니다.

참고: 이와 같은 많은 백그라운드 프로세스는 상호 작용을 위한 추가 표면을 제공하는 시스템 서비스를 통해 관리되며 일반적으로 HUP 를 보내는 것보다 서비스 자체를 다시 시작하는 것이 좋습니다. 하나의 실행 중인 프로세스에 직접 신호를 보냅니다. 다양한 서비스의 구성 파일을 검토하면 다양한 서비스 다시 시작 후크가 로그 및 기타 보고를 제공하는 동시에 특정 프로세스에 신호를 보내는 것과 정확히 일치하도록 설계되었음을 알 수 있습니다.

-l 플래그와 함께 kill로 보낼 수 있는 모든 신호를 나열할 수 있습니다.

  1. kill -l
Output
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM

신호를 보내는 일반적인 방법은 PID를 사용하는 것이지만 일반 프로세스 이름을 사용하여 신호를 보내는 방법도 있습니다.

pkill 명령은 kill과 거의 동일한 방식으로 작동하지만 대신 프로세스 이름에서 작동합니다.

  1. pkill -9 ping

위 명령은 다음과 동일합니다.

  1. kill -9 `pgrep ping`

특정 프로세스의 모든 인스턴스에 신호를 보내려면 killall 명령을 사용할 수 있습니다.

  1. killall firefox

위의 명령은 컴퓨터에서 실행 중인 모든 firefox 인스턴스에 TERM 신호를 보냅니다.

4단계 – 프로세스 우선순위 조정 방법

종종 서버 환경에서 어떤 프로세스에 우선 순위가 부여되는지 조정하고 싶을 것입니다.

일부 프로세스는 상황에 따라 미션 크리티컬한 것으로 간주될 수 있는 반면 다른 프로세스는 남은 리소스가 있을 때마다 실행될 수 있습니다.

Linux는 niceness라는 값을 통해 우선 순위를 제어합니다.

우선 순위가 높은 작업은 리소스도 공유하지 않기 때문에 덜 좋은 것으로 간주됩니다. 반면에 우선 순위가 낮은 프로세스는 최소한의 리소스만 사용하기 때문에 좋습니다.

기사 시작 부분에서 top을 실행했을 때 "NI\라고 표시된 열이 있었습니다. 이것이 프로세스의 nice 값입니다.

  1. top
[secondary_label Output] 
Tasks:  56 total,   1 running,  55 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1019600k total,   324496k used,   695104k free,     8512k buffers
Swap:        0k total,        0k used,        0k free,   264812k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
 1635 root      20   0 17300 1200  920 R  0.3  0.1   0:00.01 top                
    1 root      20   0 24188 2120 1300 S  0.0  0.2   0:00.56 init               
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd           
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.11 ksoftirqd/0

Nice 값의 범위는 시스템에 따라 -19/-20(가장 높은 우선순위)에서 19/20(가장 낮은 우선순위) 사이입니다.

특정 nice 값으로 프로그램을 실행하려면 nice 명령을 사용할 수 있습니다.

  1. nice -n 15 command_to_execute

이것은 새 프로그램을 시작할 때만 작동합니다.

이미 실행 중인 프로그램의 nice 값을 변경하려면 renice라는 도구를 사용합니다.

  1. renice 0 PID_to_prioritize

결론

프로세스 관리는 거의 모든 상황에서 유용한 Linux의 기본 부분입니다. 실제 시스템 관리를 수행하지 않더라도 중단된 프로세스를 추적하고 신중하게 처리할 수 있는 기능은 매우 유용합니다.

다음으로 netstatdu를 사용하여 다른 서버 리소스를 모니터링하는 방법을 배울 수 있습니다.