OS 및 스토리지/Linux

[리눅스] 멀티 프로세스(process)와 잡(job) 개념과 명령어

Cloud Engineer 2022. 2. 12. 21:35

1. 들어가기 전

리눅스는 여러 개의 프로세스를 병렬로 처리할 수 있는 멀티 프로세스를 지원하는 운영체제로, 한정된 CPU 코어보다 많은 프로세스를 처리할 수 있게 해줍니다. 예를 들어 8개의 CPU 코어를 가진 리눅스 운영체제에서 50개의 프로세스를 처리하는 것도 가능합니다. 리눅스 시스템 관리자에게 리눅스의 프로세스 관리 방식과 여러 개의 프로세스를 하나의 그룹으로 사용하게 해주는 잡(job)에 대한 이해는 필수입니다. 본 포스팅에서는 프로세스와 잡에 대해 알아보겠습니다.

2. 프로세스와 잡

2.1 - 프로세스

프로세스는 시스템(리눅스, 윈도우 등)에서 수행하는 작업을 뜻하며, 리눅스 환경에서는 계층 구조를 통해 수많은 프로세스를 체계적으로 관리합니다. 이러한 계층 구조로 인해 좀비 프로세스와 고아 프로세스이 수반될 수 밖에 없다는 단점이 존재하기도 합니다.

2.1.1 - 좀비 프로세스

자식 프로세스가 종료되었음에도 부모 프로세스가 자식 프로세스의 종료 상태를 인지하지 못한 경우 자식 프로세스를 좀비 프로세스라고 합니다.

자식 프로세스가 종료될 때 부모 프로세스의 프로그램 오류에 따른 종료 콜 미수행 혹은 커널의 오류로 좀비 프로세스가 될 가능성이 있습니다.

2.1.2 - 고아 프로세스

자식 프로세스가 살아있는 상태에서 부모 프로세스가 먼저 종료가 되었을 때, 아직 살아있는 자식 프로세스를 고아 프로세스라고 합니다.

리눅스에서는 고아 프로세스가 발생하는 것을 방지하기 위해 부모 프로세스가 먼저 종료되었을 경우 리눅스 커널은 자식 프로세스의 부모로 init 프로세스(리눅스가 부팅될 때 가장 먼저 시작되는 프로세스)를 설정해줍니다. 따라서 자식 프로세스가 종료될 경우 init 프로세스는 자식 프로세스가 종료 상태로 변경된 것을 확인 후 자식 프로세스가 점유한 자원을 정상적으로 회수합니다.

2.2 - 잡(job)

두개 이상의 명령어를 파이프라인( | )으로 연결하여 실행했을 때 발생하는 여러 개의 프로세스를 하나의 그룹으로 관리하게 되는데 이 그룹을 잡이라고 합니다. 잡과 프로세스는 각각 고유 번호를 가지고 있습니다.

3. 프로세스/잡 관련 리눅스 필수 명령어

3.1 - ps

현재 기동 중인 프로세스에 ID를 붙여 리스트로 보여주는 명령어입니다.
경로: /bin/ps
$ ps

PID    TTY       TIME   CMD
11301 pts/0    00:00:00 bash	# bash 쉘
14141 pts/0    00:00:00 ps		# ps 명령
  • PID : 프로세스의 고유 번호
  • TTY: 사용하고 있는 터미널의 단말 번호
  • TIME: CPU를 점유한 시간
  • CMD: 명령어 이름

3.2 - jobs

백그라운드에서 실행 중인 잡(job)에 고유번호를 붙여 리스트로 보여주는 명령어입니다.
경로: /bin/jobs
# 1. 초기 상태
$ jobs

# 2. 백그라운드 작업 추가
$ sleep 50 &
[1] 1576

$ sleep 100 &
[2] 1594

$ sleep 120 &
[3] 1618

# 3. 전체 잡 확인
$ jobs
[1]    running    sleep 50
[2]  - running    sleep 100
[3]  + running    sleep 120

# 3-1. 세션 상태값과 같이 확인
$ jobs -l
[1]    1576 running    sleep 50
[2]  - 1594 running    sleep 100
[3]  + 1618 running    sleep 120

# 3-2. 실행 중인 잡 출력
$ jobs -r
[1]    running    sleep 50
[2]  - running    sleep 100
[3]  + running    sleep 120

# 4. 작업 시간이 끝난 상태의 잡 확인
$ jobs
[1]    1576 done       sleep 50
[2]  - 1594 done       sleep 100
[3]  + 1618 done       sleep 120

3.3 - kill

프로세스 또는 잡을 종료하는 명령어입니다.
경로: 쉘에 내장된 명령어 (jobs is a shell builtin)
# 1. 1593 프로세스 종료
$ kill 1593

# 1-1. 1593 프로세스 강제 종료
# kill -9 1593

 

[출처]

- https://codetravel.tistory.com/31

- https://zetawiki.com/wiki/%EC%A2%80%EB%B9%84_%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4_%EC%B0%BE%EA%B8%B0,_%EC%A3%BD%EC%9D%B4%EA%B8%B0

- https://hippogrammer.tistory.com/89