본문 바로가기
OS 운영체제

PID (프로세스 식별자)

by yororing 2024. 9. 20.

00 개요

  • 회사에서 코드분석 중, PID가 3보다 작은지 확인하고, 3보다 작다면 해당 process가 실행중이지 않는다는 메세지를 출력하는 스크립트가 있음
  • PID가 3보다 작은지 여부를 확인하는 이유에 대한 정리

01 PID란

1. 정의

  • 프로세스 식별자 (Process ID)
  • 운영 체제에서 각 프로세스에 고유하게 부여되는 식별 번호
  • 운영 체제에서 실행되는 모든 프로그램은 프로세스 형태로 관리되며, 이 프로세스들은 각각 PID를 통해 구별됨

2. 역할

  • 고유한 식별자: PID는 운영 체제 내에서 실행 중인 프로세스를 고유하게 식별 가능케 함. 각 프로세스는 다른 프로세스와 구별되기 위해 고유한 PID를 가짐
  • 프로세스 관리: PID는 시스템 관리자나 사용자가 프로세스를 추적하거나 제어할 때 필요함. 예) 특정 프로세스를 종료할 때 kill 명령어와 함께 PID를 사용하여 해당 프로세스를 종료 가능
  • 자식 프로세스 생성: 프로세스는 다른 프로세스를 생성 가능. 부모 프로세스는 자식 프로세스의 PID를 기억하고, 이를 통해 자식 프로세스를 제어 가능. 이를 통해 프로세스 간의 관계 관리 가능.

3. 관련 명령어

  • ps: 현재 시스템에서 실행 중인 프로세스를 확인하고, 각 프로세스의 PID를 볼 수 있는 명령어
ps aux
# 모든 실행 중인 프로세스와 그에 대한 정보(PID, 사용자, 메모리 사용량 등) 출력
  • kill: 특정 PID를 가진 프로세스를 종료하는 명령어
kill <PID>
# <PID>에 해당하는 프로세스 종료

4. PID 값

  • PID 1
    • 리눅스 시스템에서 가장 중요한 프로세스 중 하나인 init 또는 systemd PID 1을 가짐
    • 이 프로세스는 시스템 부팅 후 가장 먼저 실행되며, 다른 모든 프로세스의 부모가 됨 
  • PID의 범위
    • 일반적으로 리눅스 시스템에서는 PID가 1부터 시작해 계속 증가
    • 새로운 프로세스가 생성될 때마다 새로운 PID가 할당됨

5. 프로세스의 상태와 PID

  • 프로세스 생성 시: 새로운 프로그램이 실행되면 운영 체제는 해당 프로그램에 PID를 부여하고, 이를 통해 프로그램을 추적함
  • 프로세스 종료 시: 프로세스가 종료되면 해당 PID는 해제되어, 나중에 새로운 프로세스에 재사용될 수 있음 

 

02 PID가 3보다 작은지 확인하는 이유

  • 아래를 보면 DAEMON_PID가 3보다 작다면 해당 프로세스가 실행중이지 않았다는 메세지를 출력하게끔 설정해놓음
#!/bin/bash

...

stop()
{
    echo "Stopping ${PROC_NAME}..."
    local DAEMON_PID=$(get_status)

    if [ "$DAEMON_PID" -lt 3 ]; then
        echo "${PROC_NAME} was not running."
    else
        kill $DAEMON_PID
        rm -f $PROC_PID
        echo " - Shutdown ...."
    fi
}

 ...
 
get_status()
{
    ps ux | grep ${PROC_NAME} | grep -v grep | awk '{print $2}'
}
  • 간단히 말하자면, 프로세스 ID(PID)가 실제로 존재하지 않거나 잘못된 값을 반환한 경우를 처리하기 위해서임
  • 이를 이해하기 위해서는 프로세스 ID의 동작과 PID의 특성에 대해 알아야 함

1. PID의 특징

  • PID는 양의 정수
    • 프로세스 ID는 보통 1 이상의 양의 정수로 할당됨
    • PID 1은 시스템 부팅 시 첫 번째로 실행되는 프로세스인 init 또는 systemd와 같은 중요한 시스템 프로세스에 할당됨
    • 일반적으로 사용자 프로세스의 PID는 100 이상의 값으로 할당되며, 운영 체제에 따라 차이가 있을 수 있음
  • get_status 함수의 동작
    • 이 함수는 ps ux 명령을 통해 현재 실행 중인 프로세스 목록에서 PROC_NAME과 일치하는 프로세스를 찾고, 그 프로세스의 PID를 출력
    • awk '{print $2}'은 해당 프로세스의 PID만 추출하여 반환
  • get_status가 반환하는 값
    • 만약 프로세스가 존재하지 않으면, ps 명령은 아무것도 출력하지 않으므로 get_status 함수는 빈 문자열을 반환
    • 하지만 스크립트의 다른 부분에서 이 값이 숫자가 아닌 빈 값으로 처리되지 않으면, 의도하지 않은 동작 발생 가능

2. PID가 3보다 작은지 확인하는 이유

  • [ "$DAEMON_PID" -lt 3 ]에서 3이라는 기준값을 설정한 이유는 주로 다음과 같은 상황을 처리하기 위함

1) 빈 값 또는 잘못된 값 처리

  • get_status()가 프로세스를 찾지 못한 경우, 반환된 값은 빈 문자열일 수 있음
  • 이 경우 스크립트가 제대로 처리하지 않으면 빈 문자열을 PID로 사용하려고 시도함
  • PID 값이 빈 문자열이거나 0 또는 1, 2인 경우, 이는 시스템의 중요한 프로세스이거나 잘못된 값임
  • 이를 방지하기 위해 PID가 3 미만인 경우에는 데몬이 실행 중이 아니라고 가정하고 메시지를 출력하는 것

2) 시스템 프로세스와의 충돌 방지

  • PID 1은 init 프로세스 또는 systemd에 할당됨
  • 이는 시스템이 부팅될 때 가장 먼저 실행되는 중요한 프로세스이므로, 이를 실수로 종료하지 않기 위해 PID가 1인 프로세스는 제외됨
  • PID 2는 리눅스 시스템에서 가상 프로세스나 특정 시스템 호출을 관리하는 데 사용될 수 있으며, 사용자가 임의로 종료해서는 안 되는 프로세스일 수 있음

3) 프로세스가 없을 경우 처리를 명확히 하기 위함

  • 프로세스가 실제로 실행 중이지 않은 상황에서 PID가 3 미만으로 반환될 가능성은 매우 낮음
  • 따라서 3 미만이라는 조건은 프로세스가 실제로 실행 중이지 않다는 신호로 사용되는 것 

결론

  • 이 검사는 PID가 3보다 작은 값이 올바른 데몬 프로세스가 아니라는 것을 가정하고, 해당 경우에는 데몬이 이미 중지되었다고 판단하기 위한 것
  • 프로세스가 실행 중이 아닐 때 또는 PID 값이 잘못되었을 때 이를 처리하기 위한 안전 장치

'OS 운영체제' 카테고리의 다른 글

고급 이론 용어 정리-동시성, 병렬성, 원자성, 의존성  (0) 2024.09.07
bitmask (비트마스크)  (0) 2024.09.05
failover (자동 전환)  (0) 2024.08.27
오버헤드 (Overhead)  (0) 2024.08.26
shared memory (공유 메모리)  (0) 2024.08.15