[Linux] 프로세스 관리

프로세스 개념

프로세스(Process)

: 실행 중인 프로그램. 시분할 시스템에서의 작업 단위. 능동적 실체

- 프로세스의 집합체 = 시스템 : OS에 의해 CPU는 프로세스들 간에 다중화하여 시스템 효율성을 높임

   - 사용자 프로세스: 사용자 실행 프로그램 (⊕ 프로그램(Program): 보조기억장치에 저장된 파일. 수동적 존재)

   - 시스템 프로세스: 사용자 관리, 메모리 관리, 네트워크 접속 관리 등 다양

 

프로세스 간의 관계

  • 프로세스들은 부모-자식 관계를 가짐: 부모 프로세스(Parent process), 자식 프로세스(Child process)
  • 필요에 따라 부모 프로세스는 자식 프로세스를 생성
    • 자식 프로스세는 또다른 자식 프로세스 생성 가능
    • 모든 프로세스는 자신을 생성한 부모 프로세스를 가짐(단, 부팅시 스케줄러가 실행한 initkthreadd 프로세스는 예외)
  • 자식 프로세스는 주어진 일을 끝내면 부모 프로세스에게 결과를 돌려주고 종료

 

프로세스 번호

: PID(Process IDentification number)

- 각 프로세스는 고유한 번호를 가짐

  • 1번부터 시작
    • 1번: init, 모든 시스템 프로세스의 부모 프로세스
    • 2번: kthreadd, 모든 스레드의 부모 프로세스
  • 시스템 부팅 후 프로세스 생성 시 1씩 증가하면서 부여

 

프로세스 종류

  1. 실행 프로세스 : 정상적인 실행을 하는 프로세스
    • 종료 시 부모 프로세스에게 exit status를 보냄 ➡ 부모 프로세스는 이 정보를 받으면 프로세스 테이블 목록에서 해당 자식 프로세스를 삭제
  2. 데몬(deamon) 프로세스: 특정 서비스를 제공하기 위한 프로세스
    • 평소에는 대기 상태 → 서비스 요청이 들어오면 해당 서비스 제공
    • 커널에 의해 실행됨
  3. 고아(orphan) 프로세스 : 부모 프로세스가 먼저 종료된 자식 프로세스
    • 1번 프로세스가 새 부모 프로세스가 되어줌
  4. 좀비(zombie) 프로세스: 자식 프로세스가 종료했는데도 부모의 프로세스 테이블에서 삭제되지 않는 경우
    • 부모 프로세스가 종료 정보를 제대로 처리하지 못했기 때문에 발생
    • 실제 실행되지는 않으나 프로세스 테이블 목록 차지 ➡ 목록이 차면 다른 프로세스를 실행하지 못하게 될 수도 있음
    • 프로세스 목록에 defunct process라 나오기도 함

 

프로세스 관리 명령

프로세스 목록 보기

: Commad format /bin/ps [옵션] - 현재 실행중인 프로세스의 목록 출력

  • 세 가지 유형의 옵션 지원
    • 유닉스(SVR4): 붙임표로 시작
    • BSD 옵션: 붙임표로 시작하지 않음
    • GNU 옵션: 붙임표 두 개로 시작
  • 각 옵션은 섞어 사용 가능하나 상반된 속성을 가진 옵션끼리 사용하면 충돌 발생 → 나에게 맞는 옵션 조합 선택해 사용해야 함

 

ps의 옵션

  • 유닉스 옵션
    • -e : 실행 중인 모든 프로세스의 정보 출력
    • -f : 프로세스에 대한 자세한 정보 출력
    • -u uid : uid 사용자에 대한 모든 프로세스 정보 출력
    • -P pid: pid 프로세스에 대한 정보 출력
  • BSD 옵션
    • a : 터미널에서 실행한 프로세스의 정보 출력
    • u : 프로세스 소유자명/CPU 사용량/메모리 사용량 등 출력
    • x : 실행 중인 모든 프로세스의 정보 출력
  • GNU 옵션
    • --pid PID : PID 프로세스의 정보를 출력

 

ps의 기본 출력

- Command format :  ps

: 현재 쉘이나 터미널엣 실행한 사용자 프로세스 목록 출력

  • PID : 프로세스 번호
  • TTY : 현재 터미널 번호
  • TIME : 프로세스가 사용한 CPU 시간 양
  • CMD : 실행중인 명령

 

상세 정보 출력

- Command format : ps -f

: 프로세스의 상세 정보 출력

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

 

전체 프로세스 목록 출력

- Command format ps -e : 실행중인 전체(entire) 프로세스 목록 출력 (TTY가 ?인 것은 데몬 프로세스)

- Command format ps -ef : 실행중인 전체 프로세스의 자세한 정보 출력

 

특정 프로세스 정보 출력

- Command format ps -p <PID> : 지정한 PID를 갖는 프로세스의 정보 출력 (f 옵션 함께 부여시 p 앞쪽에)

- Command format ps -ef | grep <프로세스정보>

 

상세 상태 정보 출력

- Command format: ps a

: 터미널에서 실행한 프로세스의 상태 정보 출력 (STAT: 프로세스 상태)

 

자원 사용량 정보 출력

- Command format: ps u

: 프로세스 소유자명/CPU 사용량/메모리 사용량 등 출력

 

상태 및 자원 사용량 출력

- Command format: ps au

: 터미널에서 실행한 프로세스들의 상태 및 자원 사용량 출력

 

전체 프로세스 목록 출력(BSD 옵션)

- Command format ps ax : 실행중인 모든 프로세스 출력 (ps -e와 유사)

- Command format ps aux : 실행중인 모든 프로세스의 자세한 정보 출력 (ps -ef와 유사)

 

시그널(Signal)

: 프로세스에 무언가 발생했음을 알리는 간단한 메시지

  • 무엇이 발생했는지 나타내는 미리 정의된 상수 사용
  • 각 시그널은 번호로 구분되면 이름을 가짐: SIGXXX
  • 시그널을 받은 프로세스는 기본적으로 종료 (e. ^c: 중단하라는 인터럽트 신호) - 시그널에 따라 프로세스 내부에서 처리 방법을 달리 할 수도..

 

시그널의 종류

: $ kill -l 

- 주요 시그널

시그널 번호 기본 처리 의미
SIGHUP 1 종료 터미널과 연결이 끊겼을 때 발생한다.
SIGINT 2 종료 인터럽트로 사용자가 Ctrl+c를 입력하면 발생한다.
SIGQUIT 3 종료, 코어덤프 종료 신호로 사용자가 Ctrl+\을 입력하면 발생한다.
(코어덤프: 죽는 순간의 정보값. 후일 디버깅에 사용)
SIGKILL 9 종료 이 시그널을 받은 프로세스는 무시할 수 없으며 강제로 종료된다.
(=SIGSTOP)
SIGALRM 14 종료 알람에 의해 발생한다.
SIGTERM 15 종료 kill 명령이 보내는 기본 시그널이다.

 

PID를 이용한 프로세스 종료

- Command format: /bin/kill [시그널] <PID>

: 지정한 시그널을 PID 프로세스에게 보냄

  • 사용자가 소유한 프로세스만 종료 가능 - root는 모든 프로세스 종료 가능
  • [시그널]
    • -15 : 프로세스가 관련된 파일을 정리하고 안전한 종료 (기본값. 무시될 수 있음)
    • -9 : 무조건 강제 종료
    • -2: 인터럽트 (ctrl+c)

 

작업 제어

프로세스 실행 형태

  • 포그라운드 작업(Foreground Jobs)
    • 사용자와 대화식으로 수행되는 프로세스들 - 한 번에 하나씩 실행됨(실행되는 동안 사용자 대기)
    • 일반적으로 사용자가 명령을 실행하는 방식
  • 백그라운드 작업(Background Jobs)
    • 명령 처리가 끝나는 것과 무관하게 바로 프롬프트가 출력됨 (입출력이 필요한 경우 일반적으로 리다이렉션 이용 필요)
    • 한 번에 여러 프로세스를 동시 실행 가능
    • 명령 실행시 끝에 &를 붙여줌

 

작업 제어

: 한 터미널에서 동시에 여러 프로세스를 실행/관리하기 위해 개발

  • 작업 전환: 포그라운드 작업 ↔ 백그라운드 작업
  • 작업 일시 중지: 작업을 임시 중단함. 추후 재개 가능한 상태
  • 작업 종료: 프로세스를 종료

 

작업 목록 보기

- Command format : jobs [%작업번호]

: 백그라운드 작업들의 목록 출력

  • 특정 작업 번호를 지정하면 해당 작업의 정보만 출력
    • %번호 : 해당 번호의 작업 정보를 출력
    • %+ 또는 %% : 작업 순서가 +인 작업 정보를 출력
    • %- : 작업 순서가 -인 작업 정보 출력

 

jobs 명령의 출력 항목

항목 출력 예 의미
작업 번호 [1] 작업 번호로서 백그라운드로 실행할 때마다 순차적으로 증가한다. ([1], [2], [3], ...)
작업 순서 + 작업 순서를 표시한다.
· + : 가장 최근에 접근한 작업
· - : + 작업보다 바로 전에 접근한 작업
· 공백: 그 외의 작업
상태 실행 중 작업의 상태를 표시한다.
· 실행 중(Running) : 현재 실행 중이다.
· 완료됨(Done) : 작업이 정상적으로 종료된다.
· 종료됨(Teminated) : 작업이 비정상적으로 종료된다.
· 정지(Stopped) : 작업이 잠시 중단된다.
명령 sleep 100 & 백그라운드로 실행 중인 명령

 

작업 전환

- Command format : 

  • [ctrl] + z : 포그라운드 작업을 정지시킴
  • bg [%작업번호] : 작업 번호가 지시하는 작업을 백그라운드 작업으로 전환
  • fg [%작업번호] : 작업 번호가 지시하는 작업을 포그라운드 작업으로 전환

 

작업 종료

- Command format :

  • [ctrl] + c : 대부분의 포그라운드 작업을 종료
    • 인터럽트 시그널을 이용
    • 해당 프로그램에서 이 시그널을 무시하도록 한 경우에는 종료되지 않을 수 있음
  • kill <%작업번호> : kill 명령의 인자로 PID 대신 작업번호 지정 가능

 

포그라운드-백드라운드 작업 전환

- 작업 중지(ctrl + z) 후 bg %작업번호

- fg %작업번호

 

작업 종료하기

- 포그라운드 작업은 ctrl+c로 대부분 종료 가능

- PID 확인 후 kill 명령으로 강제 종료

 

로그아웃 후에도 작업 지속

- Command format : /usr/bin/nohup [명령] &

: 로그아웃을 한 뒤에도 백그라운드 작업을 계속 실행시킴

  - 기본적으로 실행 결과와 오류 메시지는 현재 경로에 nohup.out 파일에 저장됨