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 |