프로세스(Process)는 실행중인 프로그램을 말한다.
보통 프로그램과 프로세스에 대해서 나중에 헷갈릴 수 있으니까 간단히 적자면
- Program은 실행파일이다.
- Program의 실행에 필요한 입력 데이터를 묶어서 Task라고 하는데 이 작업이 컴퓨터에서 실행시키게 되면 커널(kernel)에 등록되는데 커널에 등록된 작업을 프로세스라고 한다.
프로세스 정보 내용
PID | 고유의 Process의 ID 번호 |
UID, GID | 프로그램을 실행시킨 사용자 |
프로세스 상태 | 실행중(R), 중지중(S), 종료불가한 중지상태(D), T-sttopped/traced, Z-zombie 등 |
우선 순위 (C) | Process의 우선 순위 |
부모 프로세스 (PPID) | 자신의 프로세스를 실행시킨 부모 프로세스 |
프로세스는 백그라운드와 포그라운드로 동작한다
- 백그라운드(Background)
- 명령어 뒤에 &를 입력하면 됨.
- 프로세스를 실행시키면 실행을 시스템에게 넘기고 명령 대기상태로 다음 명령 기다림
- 장기간 작업이 필요한 경우 필요함.
- ps 명령어로 진행상태 확인할 수 있다.
- 포그라운드(Foreground)
- 쉘(Shell) 프롬프트에서 명령을 입력하고 Enter 치면 대부분 포 그라운드로 실행 됨.
- 종료하고 싶을 시 Ctrl 과 C 를 누르면 됨.
프로세스 관리 명령어
프로세스 상태 명령어 ps
ps는 Process Status 의 약자로 실행되고 있는 프로세스 상태를 화면에 출력하는 명령어다.
Background 프로세스가 잘못되어 무한 루프에 빠지거나 사용자가 수행중인 Background 프로세스를 강제로 중단해야될 때 해당 프로세스의 정보를 알아보는데 사용한다.
ps 명령어의 형식
- ps 명령어를 잘 못 쓰면 도움말이 나오는데 simple, list 등의 명령어가 있는걸 확인할 수 있다.
ps + [options] 의 형식으로 쓰며 옵션들은 아래와 같다.
- -a : 다른 사용자에 의해 생성된 모든 프로세스 목록
- -d : 프로세스 그룹의 reader를 제외한 모든 프로세스에 대한 정보
- -e , -A : 시스템 내에서 실행중인 모든 프로세스 출력
- -f : 프로세스에 관한 모든 자세한 정보를 출력
- -l (알파벳 엘): 프로세스에 관한 정보를 자세히 출력
- -n namelist : 시스템 내의 namelist 파일의 이름을 지정
- -u : 사용자 이름 등을 매우 자세히 출력
- -x : 제어 터미널을 갖고있지 않은 프로세스도 출력
- -U [사용자 로그인명]: 지정한 사용자 ID 번호나 이름을 갖고 있는 프로세스에 관한 정보
- ex : 사용자 명이 ubuntu면 ps -U ubuntu
개인적으로 자주 쓰는 명령어는 ps -ef 다.
ps -ef | grep java 형식으로 쓰는데 e와 f 를 합친 뜻이다.
해석하면 시스템 내에서 사용하는 모든 java라는 단어를 가진 프로세스를 찾아라 정도로 할 수 있겠다.
프로세스 종속관계 명령어 pstree
pstree는 (display a tree of processes)는 현재 시스템에서 실행되고 있는 프로세스들을 종속 관계를 표현할 수 있도록 Tree 형태로 출력하는 명령어다.
간단하게 살펴보면 4번째 줄의 amazon-ssm-agen은 systemd의 자식이고, ssm-agent-worke를 자식으로 두고 있는 것을 살펴 볼 수 있다.
프로세스 실시간 상태 조회 명령어 top
top 명령어 ( display top CPU process) 는 현재 시스템에서 수행중인 프로세스의 진행 상태를 실시간으로 출력해 주는 명령이다. 이 명령어는 CPU 사용시간, 메모리 사용량, 프로세스의 상태, 우선순위 등의 정보를 제공한다.
형식 : top [options]
- -d 갱신시간 : 모니터에 업데이트 시간 간격을 조정
- -q 화면을 계속 갱신함.
- - i idle 상태와 zombie 프로세스를 무시함.
항목 | 설명 |
PID | Process ID |
USER | 소유자 |
PR | Priority (우선순위) |
NI | Nice Value ( -20 ~ 19 사이) : 작을수록 우선순위가 높아짐. |
VIRT | = SWAP + RES 가상이미지 ( 단위는 kb) |
RES | = CODE + DATA 상주메모리 사이즈 ( Resident size ) (단위 : kb ) |
SHR | 공유 메모리 사이즈 ( 단위 : kb) |
S | 프로세스 상태 ( Status ) D : 휴지가가 없이 동작되는 상태. (Uninterruptiable sleep) 디스크 혹은 네트워크 I/O를 대기 R : 동작중인 상태 S : 휴식 상태 ( sleep) T : 추적되어지거나 또는 멈춘 상태 Z : 좀비 ( Zombie ) 상태 |
%CPU | CPU 사용 시간 퍼센트 |
%MEM | 메모리 사용 퍼센트 |
TIME+ | 프로세스가 시작해 CPU를 사용한 총 시간 ( 누적 사용 시간) |
COMMAND | 프로세스를 실행한 명령어 확인 |
실제로 top 명령어를 쳐보면 이렇게 나온다. 위의 표와 비교해서 확인해보면 좋을 것 같다.
top 명령어 안에서 사용할 수 있는 명령어
명령어 | 설명 |
SPACE | 화면 갱신 |
h, ? | 도움말을 출력 |
k | k를 입력하고, PID를 입력하면 PID 값의 프로세스를 kill 명령으로 종료시킴 |
i | Zombie, Idle 프로세스의 출력을 On/ Off 시킴 |
n 또는 # | 출력한 프로세스의 수를 저장 |
q | top 종료 |
r | Nice 값을 변경 |
s | 화면을 갱신하는 시간을 변경 |
F, f | 보여줄 항목을 추가하거나 삭제 |
O, o | 보여줄 항목의 순서 (order)를 바꿈 |
l | top의 맨 윗줄 ( uptime )을 On/Off |
m | 메모리의 관련된 항목을 On/ Off |
t | 프로세스와 CPU 항목을 On/Off |
c | Command line의 옵션을 On/Off |
M | 프로세스의 RSS 값을 정렬 |
P | %CPU 값으로 정렬 |
T | Time 값으로 정렬 |
W | 바꾼설정을 저장 |
프로세스 종료 명령어 kill, killall
kill 명령어는 말 그대로 프로세스를 죽이는 명령어이다. Background 에서 실행중인 프로세스나 nohup과 함께 실행되는 프로세스를 종료시킬 수 있다. (nohub과 백그라운드 실행이 뭔지 궁금하면 여기.)
- 사용자는 자신 소유의 프로세스만 종료할 수 있다.
- ps 명령어로 PID를 알아내서 kill할 수 있다.
- 기본적으로 시그널 숫자는 15번이며, 15번 이외의 번호는 시그널 번호 15를 무시하는 프로세스를 종료시키기에 유용.
기본적인 용법은 kill [-시그널번호] [PID] 이다.
실습을 위해서 top& 명령어를 통해서 top을 백그라운드에서 실행시켜봤다.
그리고 ps -f 명령어를 통해서 top의 PID가 19112인 걸 확인하고
kill -9 19112 명령어를 통해서 top의 프로세스를 강제 종료를 했다.
-9를 쓴 이유는 위의 이미지에서 SIGKILL이 9이기 때문에 사용했다.
kill 명령어 후 ps -f 로 다시 조회했을 때 프로세스가 종료된 걸 볼 수 있다.
killall은 모든 프로세스를 종료시킨다.