소개
우리 대부분은 컴퓨터를 사용할 때 다양한 애플리케이션을 실행합니다. 이러한 애플리케이션은 서버 또는 운영 체제라고 불리는 프로그램에 의해 실행됩니다. 서로 다른 방식으로 작동하는 다양한 종류의 서버가 있습니다. 그중 하나가 바로 Linux입니다. Linux는 프로세스 형태로 애플리케이션을 실행합니다.
Linux에서는 각 애플리케이션을 '프로세스'라고 부릅니다. 서버는 프로세스 수명 주기의 로우레벨(low-level) 측면을 관리할 수 있습니다. 사용자는 몇 가지 하이레벨(higher-level) 측면을 조작하기 위해 서버와 상호 작용해야 할 수 있습니다. 다양한 도구를 사용하여 OS와 통신하고 이를 관리할 수 있습니다. 서버의 다양한 측면과 기능을 수정하는 데 사용할 수 있는 많은 명령어가 있습니다. 다음은 쉽게 따라 할 수 있는 Ubuntu에서 Linux 기반 서버를 쉽게 설정하는 방법에 대한 튜토리얼입니다. 추가로 LAMP 스택(Linux, Apache, MySQL, PHP)을 설치하는 방법.
을 배울 수 있습니다. 이 가이드는 Linux에서 ps, kill, nice를 사용하여 프로세스를 관리하는 방법에 초점을 맞춥니다.
Linux에서 실행 중인 프로세스 보기
- top
우선, 가장 기본적으로 알아야 할 명령어 중 하나는 top입니다. 이 도구는 현재 시스템에서 어떤 프로세스가 실행 중인지 시각적으로 보여줍니다. 실행하면 다음과 같이 나타납니다:
|
1 |
top |

결과 화면의 상단에서 시스템 통계를 확인할 수 있습니다. 여기에는 시스템 부하(load) 및 작업(task) 수와 같은 정보가 표시됩니다. 이 예시에서는 실행 중인 프로세스가 1개, 대기(idle) 상태인 프로세스가 55개 있음을 알 수 있습니다. 대기 또는 휴면(sleeping) 프로세스는 현재 사용하지 않는 프로세스입니다. 즉, 시스템 리소스를 차지하지 않고 있음을 의미합니다. 마지막으로, 팝업 하단 부근에서 사용량 통계와 함께 실행 중인 모든 프로세스를 볼 수 있습니다.
- htop
이 명령어를 사용하기 전에, 다음을 입력하고 실행하여 저장소에서 설치해야 합니다:
|
1 |
sudo apt-get install htop |
설치가 완료되면 top과 유사한 정보를 표시하는 데 사용할 수 있습니다. 가장 큰 차이점은 htop 명령어를 사용하면 훨씬 더 사용자 친화적인 결과를 얻을 수 있다는 것입니다:
|
1 |
htop |

보시다시피, 이 결과는 쉽게 파악하고 해석할 수 있습니다.
ps를 사용하여 프로세스 목록 표시하기
실행 중인 프로세스를 보기 위해 앞서 언급한 명령어들을 사용할 수 있지만, 모든 시나리오를 다 커버할 수는 없습니다. 다행히도 우리에게는 더 강력하고 유연한 도구가 있습니다. 바로 ps 명령어입니다.
명령어를 있는 그대로 실행하면 무엇이 표시되는지 살펴보겠습니다:
|
1 |
ps |

이 출력 결과에서는 현재 사용자 및 세션과 관련하여 실행 중인 모든 프로세스를 볼 수 있습니다. 하지만 많은 정보를 제공하지는 않습니다.
시스템에서 실행 중인 모든 프로세스를 보다 종합적으로 보려면 인자(argument)를 사용해야 합니다. 인자를 사용하면 터미널 연결 여부와 관계없이 모든 사용자가 소유한 모든 프로세스를 볼 수 있습니다. 출력 결과 또한 매우 사용자 친화적이고 읽기 쉬운 형식으로 나타납니다. 다음은 그 예시입니다:
|
1 |
ps aux |

반면에 이 정보를 트리 형식으로 시각화할 수도 있습니다. 여기서 보시다시피 계층적 관계도 명확하게 드러납니다:
|
1 |
ps axjf |

이 예시에서는 kthreadd가 그 뒤를 따르는 프로세스들의 부모 프로세스로 표시되는 것을 볼 수 있습니다.
- 프로세스 ID란 무엇인가요?
Linux 또는 Unix 사용자라면 프로세스 ID에 대해 알아야 합니다. PID라고도 하는 이것은 시스템이 각 프로세스에 부여하는 고유한 식별자입니다. 서버는 이 식별자를 통해 개별 프로세스를 추적합니다. 특정 프로세스의 PID를 알아보려면 다음과 같이 pgrep 명령어를 사용해야 합니다:
|
1 |
pgrep bash |
|
1 2 |
출력: 1340 |
시스템을 부팅하면 첫 번째 프로세스가 실행되기 시작합니다. 이 프로세스를 init이라고 합니다. 기본 메커니즘에 따라 init 프로세스는 PID '1'을 부여받습니다. 이 프로세스의 PID는 다음과 같이 확인할 수 있습니다:
|
1 |
pgrep init |
|
1 2 |
출력: 1 |
그러면 init 프로세스는 다른 모든 프로그램이나 프로세스를 부팅할 책임을 갖게 됩니다. 당연히 그 뒤를 잇는 프로세스들은 점차 증가하거나 더 큰 PID를 갖게 됩니다.
- 부모 프로세스란 무엇인가요?
알아두어야 할 또 다른 개념은 부모 프로세스(parent process)입니다. 프로세스 A가 프로세스 B를 생성하면, 프로세스 A는 프로세스 B의 부모 프로세스가 됩니다. 이 둘을 구분하는 데 도움이 되도록 시스템은 부모 프로세스에 PPID를 할당합니다. top, htop, ps와 같은 관리 명령을 실행할 때마다 열 헤더에서 이 PPID를 확인할 수 있습니다.
- 부모-자식 관계란 무엇인가요?
이미 알고 있듯이, 부모 프로세스는 자식 프로세스를 생성합니다. 이 생성은 두 단계로 이루어집니다. 첫 번째는 fork()입니다. 이는 새로운 주소 공간을 생성하는 것으로 시작합니다. 또한 쓰기 시 복사(copy-on-write)를 사용하여 부모의 리소스를 복사하므로 자식 프로세스에서도 이를 사용할 수 있습니다. 두 번째는 exec()입니다. 이는 새로 생성된 주소 공간에 실행 파일을 로드하고 실행하는 역할을 합니다.
- 자식 프로세스가 부모 프로세스보다 먼저 종료되면 어떻게 되나요?
이런 일이 발생하면 자식 프로세스는 좀비(zombie)가 됩니다. 즉, 부모 프로세스가 해당 프로세스에 대한 정보를 수집하거나 커널에 관련 정보가 필요 없다고 알릴 때까지 좀비 상태로 남게 됩니다. 이 작업이 완료되면 프로세스가 사용하던 리소스가 해제됩니다.
- 부모 프로세스가 자식 프로세스보다 먼저 종료되면 어떻게 되나요?
이 시나리오에서는 시스템이 자식 프로세스를 다른 부모 프로세스에 재할당합니다. 이는 init 또는 다른 프로세스가 될 수 있습니다.
Linux에서 프로세스에 시그널 보내기
시그널을 보내 특정 프로세스가 반응하도록 할 수 있습니다. 시그널은 운영 체제와 통신하는 데 도움이 됩니다. 시그널을 사용하여 애플리케이션을 종료, 실행하거나 특정 동작 또는 작업을 수정할 수 있습니다.
- PID를 사용하여 시그널 보내기
Linux에서 시그널을 보내는 데 사용할 수 있는 유틸리티 중 하나는 kill입니다. 이 명령은 이름에서 알 수 있듯이 프로세스를 종료하거나 죽이는 데 도움이 됩니다:
|
1 |
kill PIDoftarget_process |
이 유틸리티는 프로세스에 TERM 시그널을 보내 프로세스를 종료하도록 지시합니다. 이 명령은 애플리케이션이 정리 작업을 수행하고 원활하게 종료되도록 합니다. TERM 시그널을 받았을 때 프로그램이 원활하게 종료되지 않는 경우, KILL 시그널을 직접 보내 우회할 수 있습니다:
|
1 |
kill -KILL PIDoftarget_process |
이 시그널은 프로그램으로 가지 않습니다. 운영 체제 커널로 전달됩니다. 커널은 프로세스를 직접 종료합니다. 프로그램이 사용자가 보내는 시그널을 무시할 때 이 방법을 사용할 수 있습니다.
이 명령에서는 시그널 이름을 관련 숫자로 대체할 수도 있습니다. 예를 들어, ‘-TERM’ 대신 ‘-15’를 사용할 수 있습니다. 마찬가지로 ‘-KILL’을 ‘-9’로 대체할 수 있습니다.
- 다양한 목적으로 시그널 사용하기
프로그램을 죽이거나 종료하는 것 외에도 시그널을 사용하여 다른 작업을 수행할 수 있습니다. 예를 들어, 데몬 재시작을 처리해야 하는 문제가 있을 수 있습니다. 데몬이 행업(hang up) 시그널 또는 HUP를 받을 때마다 다음과 같은 프로그램에서는 재시작됩니다: Apache. 이를 재정의하려면 다음 시그널을 사용할 수 있습니다:
|
1 |
sudo kill -HUP pidofapache |
이 명령은 Apache가 구성을 다시 로드하도록 합니다. 결과적으로 관련 콘텐츠를 계속 제공하게 됩니다.
kill 유틸리티로 보낼 수 있는 시그널을 확인하려면 다음 명령을 사용하십시오:
|
1 |
kill -l |

- 이름으로 시그널 보내기
전통적으로는 프로그램의 PID를 사용하여 시그널을 보냈습니다. 하지만 프로세스의 일반 이름을 사용하여 시그널을 보낼 수도 있습니다. 이를 위해 pkill 명령을 사용할 수 있습니다. 이는 pkill 명령이 작동하는 방식과 유사하게 작동합니다. 유일한 차이점은 프로세스 이름을 사용할 수 있다는 것입니다:
|
1 |
pkill -9 ping |
이 pkill 명령은 다음 kill 명령과 동일합니다:
|
1 |
kill -9 `pgrep ping` |
특정 프로세스가 아닌 모든 인스턴스에 시그널을 보내고 싶을 때 사용할 수 있는 명령도 있습니다. 다음 명령은 시스템에서 실행 중인 모든 Firefox 인스턴스에 TERM 시그널을 보냅니다:
|
1 |
killall firefox |
프로세스 우선순위 조정하기
Linux 명령어로 할 수 있는 또 다른 작업은 우선순위를 조정하는 것입니다. 이는 서버 환경에서 어떤 프로세스가 우선순위를 가질지 결정할 수 있음을 의미합니다. 중요하다고 생각하는 특정 프로세스가 있을 수 있습니다. 다른 프로세스는 그만큼 필요하지 않을 수도 있습니다. 시스템은 여유 리소스가 있을 때만 후자의 프로그램을 실행합니다.
Linux에서는 niceness 명령어를 통해 프로세스 우선순위를 제어할 수 있습니다. 이 값은 우선순위가 높은 작업은 덜 친절함(less nice)으로, 우선순위가 낮은 프로세스는 더 친절함(more nice)으로 나타냅니다. 이렇게 생각해 보세요. 우선순위가 높은 프로세스는 리소스를 독점하기 때문에 덜 친절합니다. 우선순위가 낮은 작업은 리소스를 공유하므로 더 친절합니다.
top 명령어를 실행하면 특정 프로세스의 nice 값을 볼 수 있습니다. 이 값은 ‘NI’ 열에 위치합니다. 우선순위가 높은 작업의 nice 값은 ‘-19/-20’ 사이입니다. 우선순위가 낮은 프로세스는 ‘19/20’ 사이입니다. 다음과 같은 화면을 보게 될 것입니다:
|
1 |
top |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
작업: 56 전체, 1 실행 중, 55 대기 중, 0 중지됨, 0 좀비 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 전체, 324496k 사용 중, 695104k 여유, 8512k 버퍼 Swap: 0k 전체, 0k 사용 중, 0k 여유, 264812k 캐시됨 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 값으로 프로세스를 실행하려면 nice 명령어를 사용하기만 하면 됩니다:
|
1 |
nice -n 15 실행할명령어 |
이 명령어는 해당 프로그램을 시작할 때만 작동합니다. 이미 실행 중인 프로그램의 nice 값을 변경하려면 renice를 사용해야 합니다:
|
1 |
renice 0 우선순위를지정할PID |
결론
보시다시피 여기에 소개된 도구들은 그래픽 도구들과는 상당히 다릅니다. 따라서 초보자에게는 이해하기 어려울 수 있습니다. 이 가이드가 명령어를 익히는 데 도움이 되기를 바랍니다. 더 많이 연습할수록 더 잘 배우고 효율적으로 사용할 수 있게 될 것입니다.
Linux 서버를 더 잘 관리하는 데 도움이 되는 다른 리소스도 확인해 보세요. 다음 튜토리얼들이 포함되어 있습니다: SSH 키 기반 인증을 사용하도록 Linux 서버를 구성하는 방법, whereis, which, whatis, readlink 및 find를 사용하여 Linux VPS 시스템에서 파일을 찾는 방법, 및 Linux VPS에서 환경 변수 및 셸 변수를 읽고 설정하는 방법.
즐거운 컴퓨팅 되세요!
댓글
아직 댓글이 없습니다. 첫 번째로 작성해 보세요.