리눅스프로그래밍

우분투 리눅스 - 프로세스 관리하기

헬로월드! 2020. 5. 23. 01:11

사용자가 입력한 명령은 프로세스가 되어 실행된다. (프로세스란, 현재 실행 중인 프로그램을 의미한다.) 

시스템에서 사용자가 실행한 프로세스 외에 사용자 관리, 메모리 관리, 네트워크 접속 관리 등 다양한 기능을 수행하는 많은 프로세스가 실행되고 있다. 내가 앞서 사용한 대부분의 명령들은 실행 시간이 짧은 것으로 실행 뒤 바로 종료 되기 때문에 짧은 시간 동안만 프로세스 상태를 유지한다. 

프로세스와 관련된 명령은 일반 사용자 계정에서도 사용하지만 특히 시스템 관리자가 많이 사용한다. 

 

리눅스는 기본적으로 다중 프로세스 시스템이므로 여러 개의 프로세스가 동시에 실행된다.

 

1. 프로세스의 개념 

1)  프로세스 부모 - 자식 관계 

- 모든 프로세스는 부모-자식 관계를 가지고 있다.

- 필요에 따라 부모 프로세스는 자식 프로세스를 생성하고, 자식 프로세스는 또 다른 자식 프로세스를 만들 수 있다.

- systemd 와 kthreadd 프로세스를 제외하고 모든 프로세스는 부모 프로세스를 가지고 있다.

- 자식 프로세스는 할 일이 끝나면 부모 프로세스에 결과를 돌려주고 종료된다.

ex. 사용자가 vi 를 실행하여 셸이 vi 프로세스를 생성할 경우, 셸은 부모 프로세스가 되고 vi 는 자식 프로세스가 된다.

사용자가 vi 를 종료하면 다시 부모 프로세스인 셸로 돌아간다. 

 

2) 프로세스 번호 (PID : Process identification number) 

- PID 는 프로세스의 고유한 번호이다. 

- PID 는 1번부터 시작하고 프로세스가 실행되면서 하나씩 증가하여 부여된다.

 

3) 프로세스의 종류

- 일반 프로세스 : 사용자가 실행한 일반적인 프로세스로, 잠깐 실행되었다가 바로 종료된다.

- 데몬 프로세스 : 특정 서비스를 제공하기 위해 존재하며 리눅스 커널에 의해 실행된다. 데몬은 평소에는 대기 상태로 있다가 서비스 요청이 들어오면 서비스를 제공한다.

- 고아 프로세스 : 자식 프로세스는 종료되면 부모 프로세스로 돌아간다. 그러나 자식 프로세스가 아직 실행 중인데 부모 프로세스가 먼저 종료되면 자식 프로세스는 고아 프로세스가 된다. 이 경우 1번 프로세스가 고아 프로세스의 새 부모 프로세스가 되어 고아 프로세스가 작업을 마치고 종료될 수 있게한다.

- 좀비 프로세스 : 자식 프로세스가 실행을 종료했는데도 프로세스 테이블 목록에 남아 있는 경우이다.( 보통 자식 프로세스가 종료될 때 부모 프로세스에 종료 정보를 보내고 , 부모 프로세스가 이 정를 받으면 자식 프로세스는 프로세스 테이블 목록에서 삭제되어야한다.) 좀비 프로세스는 defunct 프로세스라고 나오기도 한다. 좀비 프로세스가 증가하면 프로세스 테이블의 용량이 부족해서 일반 프로세스가 실행되지 않을 수도 있다. 

 

2. 프로세스 관리 명령

ps

- 기능: 현재 실행 중인 프로세스의 정보를 출력한다.

- 형식: ps [ 옵션 ]

- 옵션 < 유닉스 옵션> : 묶어서 사용가능, 붙임표로 시작

        -e : 시스템에서 실행 중인 모든 프로세스 출력

        -f : 프로세스의 자세한 정보 출력

        -u uid: 특정 사용자에 대한 모든 프로세스의 정보를 출력

        -p pid : pid 로 지정한 특정 프로세스의 정보를 출력

         <BSD 옵션> : 묶어서 사용 가능, 붙임표로 시작 X 

        a : 터미널에서 실행한 프로세스의 정보를 출력

        u :  프로세스 소유자 이름, CPU 사용량, 메모리 사용량 등 상세 정보 출력

        x : 시스템에서 실행 중인 모든 프로세스의 정보를 출력

         < GNU 옵션> : 붙임표 두개로 시작 

       --pid PID 목록: 목록으로 지정한 특정 PID 의 정보를 출력

 

ps 명령을 옵션 없이 사용하면 현재 셀이나 터미널에서 실행한 사용자 프로세스에 대한 정보를 출력한다.

ps -f 로 실행하면 UID,PID 등등 여러가지가 나온다. (상세 정보)

 

항목 의미 항목 의미
UID 프로세스를 실행한 사용자 UID STIME 프로세스의 시작 날짜나 시간
PID 프로세스 번호 TIY 프로세스가 실행된 터미널의 종류와 번호
PPID 부모 프로세스 번호 TIME 프로세스 실행 시간
C CPU 사용량 (%값) CMD 실행되고 있는 프로그램 이름 (명령)

 

ps a 를 실행하면 터미널에서 실행한 프로세스의 정보를 출력한다. 

PID, TTY, STAT, TIME, COMMAND 가 나오고, 이때 STAT 에 사용되는 문자에는 의미가 있다. 

문자 의미 비고
R 실행 중 (Running)  
S 인터럽트가 가능한 대기 상태 (sleep)  
작업 제어에 의해 정지된 상태  
Z 좀비 프로세스 (defunct)  
STIME 프세스의 시작 날짜나 시간  
s 세션 리더 프로세스 BSD 형식
+ 포그운드 프로세스 그룹 BSD 형식
멀티 스레드 (소문자 L) BSD 형식

ps au 의 출력 정보

: a 옵션과 u 션 함께 사용하면 터미널에서 실행한 프로세스의 상세 정보를 출력한다.

항목 의미 항목 의미
USER 사용자 계정 이름  VSZ 사용 중인 가상 메모리 크기
%CPU 퍼센트로 표시한 CPU 사용량 RSS 사용 중인 물리적 메모리 크기
%MEN 퍼센트로 표시한 물리적 메모리 사용량 START 프로세스 시작 시간

전체 프로세스 목록 출력: ps -e

TTY 의 값이 ? 인 것은 대부분 데몬으로 시스템이 실행한 프로세스 

ps -e|more 이나 ps -e|less를 이용하여 단위로 확인이 가능하다. (빠져나올때 ctrl+z)

더 자세한 정보를 알고 싶다면 ps -ef 함께 이용해본다. 

 

BSE 옵션 : ax 는 -e 와 마찬가지로 시스템에서 실행 중인 모든 프로세스 출력

ps ax |more

aux 옵션은 -ef 처럼 더 자세한 정보를 출력한다.

ps aux|more

 

특정 사용자의 프로세스 목록 출력 -u옵션

ps -u user1

더 상세한 정보를 원한다면 -f 옵션을 사용한다.

ps -fu user1

 

특정 프로세스 정보 출력 -p 옵션

-p 옵션과 함께 특정 PID 를 지정하면 해당 프로세스의 정보를 출력한다.

ps -p 4882

 

 

ps 명령을 이용해 특정 프로세스 정보 검색

ps 명령과 grep 명령을 | 로 연결하여 특정 프로세스에 대한 정보를 검색한다.

ps -ef|grep bash 

이때 f 옵션을 함께 사용해주는게 좋다!