♥신뢰할수 있는 뉴스만 전하는♥

Linux : 프로세스 (1) 본문

리눅스

Linux : 프로세스 (1)

모두의유머 2019. 5. 31. 10:39

프로세스 ( 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>

출처 : https://neul-carpediem.tistory.com/91?category=788657

Comments