프로세스 ( Process )
- 커널의 관리하에 현재 시스템에서 동작중인 프로그램
- 커널은 프로세스를 관리하기 위해 각 프로세스에게 PCB할당
PCB ( Process Control Block )
- 프로세스 고유 번호 ( PID/Process ID )
- 우선 순위 ( Priority )
- 현재 상태 ( Current Status )
프로세스 종류
① init 프로세스
부팅 시 가장 먼저 실행되어 시스템에 전반적인 설정을 하는 초기화 프로세스
② daemon 프로세스
사용자에게 특정 기능이나, 서비스를 제공하는 프로세스
③ 부모(Parent) 프로세스
다른 프로세스를 생성하며, init 프로세스를 제외한 모든 프로세스는 부모 프로세스를 가지고 있습니다.
④ 자식(Child) 프로세스
부모 프로세스에 의해 생성된 프로세스
자식 프로세스는 작업을 완료하게되면 그 결과를 부모 프로세스에게 전달하고 종료됩니다.
⑤ 고아(Orphan) 프로세스
자식 프로세스보다 부모 프로세스가 먼저 종료가 되었을 때 자식 프로세스는 고아 프로세스가 되어, init 프로세스가 관리하게 됩니다.
⑥ 좀비(Zombie) 프로세스
자식 프로세스의 종료 신호를 부모 프로세스가 처리하지 못할 경우 자식 프로세스는 좀비 프로세스가 됩니다.
#ps (Process Status) [옵션]
시스템에 동작중인 프로세스를 확인
→ 옵션
-ef
e 모든 프로세스에 대한 리스트 출력
f full format 모든 형식으로 출력
-aux
a 다른 사용자들의 프로세스도 출력
u 사용자 이름, 시간 등 상세한 정보를 출력
x 현재 실행되고 있는 모든 프로세스를 출력
#ps -ef
UID - 프로세스를 실행 시킨 프로세스의 소유자를 의미
PID - 실행 된 프로세스에 부여된 숫자 ( ID ) ★
PPID - Parent PID, 프로세스를 생성한 부모 프로세스의 PID ★
C - 스케쥴링 관련 필드이지만, 현재는 사용안함
STIME - 프로세스가 시작된 시간
TTY - 프로세스가 연결된 터미널
TIME - 프로세스에 의해 CPU가 동작한 시간
CMD - 실행한 프로세스 명 (이름/사용한 명령어)
※ 프로세스 명 (CMD)
[프로세스] " [ ] " → 커널이 동작하는데 사용되는 프로세스로 사용자가 다룰 수 없다.
#ps -aux
USER - 프로세스 소유자의 계정 이름
PPID - 부모 프로세스의 PID
%CPU - 사용된 CPU의 측정량
%MEN - 사용된 메모리의 측정량
VSZ - 가상 메모리 크기
RSS - 사용된 실제 메모리
TTY - 프로세스와 관련된 가상 터미널
STAT - 프로세스의 상태
R (Running) 실행 중
S (Sleep) 대기 상태
T (Stop) 작업 제어에 의해 정지된 상태
Z (defunct) 좀비 프로세스
X 완전히 죽어 있는 프로세스
D io와 같이 중지(interrupt)시킬 수 없는 잠자고 있는 (휴식) 프로세스 상태
< 프로세스의 우선 순위가 높은 상태
N 프로세스의 우선 순위가 낮은 상태
L 실시간이나 기존 IO를 위해 메모리 안에 잠겨진 페이지를 가진 상태
s 세션 리더 (주도 프로세스)
I 멀티 쓰레드
+ 포어그래운드 상태로 동작하는 프로세스
STIME 프로세스 시작 시간
TIME 총 CPU 사용 시간
COMMAND 실행된 프로세스 명, 실행된 명령어
# kill
프로세스에게 SIGNAL(신호)를 전달하는 명령어
※ 기본 값이 프로세스를 종료하겠다는 뜻으로 동작해서 kill이라는 이름으로 사용하는 것입니다.
신호 종류 확인
# kill -l
2) SIGINT 프로세스 종료
9) SIGKILL 프로세스 종료 (강제)
15) SIGTERM 프로세스 종료
18) SIGCONT 프로세스 재시작
19) SIGSTOP 프로세스 정지
형식 #kill -[번호/SIGNAL] [PID/작업번호]
ex) PID 1000번 프로세스에게 종료 신호 전달
#kill -9 1000
#kill -SIGKILL 1000
<실습 1>
세션을 추가하여 vi 프로세스에게 종료 신호 전달하기
세션 1 세션 2
vi /etc/passwd 입력 ps -ef로 vi 프로세스 확인
vi(=vim)의 PID는 2085입니다.
세션 2에서 kill을 이용하여 종료 신호 전달하기
위와 같이 "죽었음"이라고 출력됩니다.
<실습 2>
고아 프로세스 확인하기
세션 1 /bin/bash로 서브 쉘을 실행 → vi /practice/services
세션 -1 세션-2
# /bin/bash → 서브쉘 실행
-------------------------------------
# vi /practice/services
# ps -ef | grep "vim"
해당 프로세스의 PPID확인
# ps -ef | grep "PPID"
어떠한 프로세스가 실행시킨 프로세스인지 확인
(부모 프로세스)
# kill -9 [PPID]
vim의 부모프로세스를 강제로 종료
# ps -ef | grep "vim"
부모 프로세스 PID확인
PPID가 1(init) 확인.
vim은 고아프로세스가 되어 init이 관리하게 됩니다.
# sleep [숫자] (초 단위)
입력한 시간 동안 대기 상태 프로세스를 생성
ex) # sleep 3 → 3초 동안 대기하는 프로세스를 생성
<실습 1>
sleep 프로세스에게 강제 종료 신호 보내기
sleep을 이용해 프롬프트 대기 상태를 만들어줍니다.
프롬프트가 999999초 동안 대기 상태가 되었습니다.
세션-2에서 kill을 이용하여 강제 종료 신호를 보냅니다.
프롬프트 대기 상태가 해제되었습니다.
프로세스 동작 형태
1. 포어 그라운드 ( Foreground Process )
CLI환경에서 입력하는 대부분의 명령어(프로세스)는 포어 그라운드로 동작합니다.
명령어의 실행과정이나 결과를 화면에 출력합니다.
2. 백 그라운드 ( Background Process )
프로세스 종료 여부에 관계없이 즉시 명령 대기 상태가 되어 다른 명령어를 사용할 수 있습니다.
백그라운드 실행 시키기 위해 "&" (ampersand)를 붙여 사용합니다.
장시간 실행되는 명령어(작업)에 유용합니다.
ex) 장시간 실행되는 작업 시 백그라운드 사용하기
#cp -r /usr /practice/test-2&
※ /usr 디렉터리의 크기가 커서 복사하는데 시간이 오래걸립니다.
# jobs 백그라운드로 동작하는 프로세스(작업)을 확인하는 명령어
# fg %[작업번호] 백그라운드 작업을 포어그라운드로 변경
# bg %[작업번호] 포어그라운드 작업을 백그라운드로 변경
# pkill [명령어]
동일 작업들을 한 번에 종료시킵니다.
<예제 1>
'서버 > Linux' 카테고리의 다른 글
[Linux] 아카이브 (Archive) (0) | 2017.10.16 |
---|---|
[Linux] 압축 ( gzip, bzip2, xz ) (0) | 2017.10.11 |
[Linux] sudo (Substitute User DO) (0) | 2017.10.11 |
[Linux] ACL ( Access Control List ) (0) | 2017.10.11 |
[Linux] 사용자 패스워드 관리 (chage) & 파일속성설정 (0) | 2017.10.11 |