기존 PID 기반 프로세스 관리의 한계
Ruby에서 PID(Process ID) 기반의 프로세스 관리는 다음과 같은 문제점을 야기합니다.
- PID 재사용: PID는 제한된 자원으로, 프로세스 종료 후 재활용될 수 있어 슈퍼바이저가 잘못된 프로세스를 모니터링하거나 제어할 위험이 있습니다. 이는 보안 취약점(샌드박스 탈출, 권한 상승)으로 이어질 수 있습니다.
- 시그널 경합: Ruby의 전역 시그널 핸들러는 자식 프로세스 종료 시
SIGCHLD
시그널 처리에서 경합을 발생시켜, 여러 컴포넌트가waitpid
를 시도할 때 종료 코드를 놓칠 수 있습니다. - 프로세스 트리 추적 한계: 부모 프로세스가 손자 프로세스의 상태를 인지하기 어렵고, 부모 사망 시 손자 프로세스는
init
에 의해 입양되어 관리 연속성이 상실됩니다.
Linux PFD(Process File Descriptor)의 도입 및 이점
이러한 문제 해결을 위해 Linux 5.3+에서 도입된 PFD(Process File Descriptor) API가 제시됩니다. PFD는 다음과 같은 이점을 제공합니다.
- 안정적인 참조: PID 재사용에 면역인 고유하고 안정적인 프로세스 참조를 제공합니다.
- 경합 없는 시그널 전달: 특정 PFD로 시그널을 보내면 해당 프로세스에만 정확히 전달됩니다.
- 효율적인 모니터링: PFD는 파일 디스크립터이므로
IO.readable?
와 같은 표준 I/O API를 통해 비블로킹, 이벤트 기반으로 프로세스 상태를 효율적으로 모니터링할 수 있습니다. - 자식-부모 모니터링: 자식 프로세스가 부모 PFD를 생성하여 부모의 생존 여부를 확인, 고아 프로세스 발생 시 적절히 대응할 수 있습니다.
Ruby에서의 PFD 구현 및 제한사항
Ruby는 PFD를 기본 지원하지 않으므로 FFI를 활용하여 pidfd_open
, pidfd_send_signal
, waitid
등 libc
시스템 호출을 직접 사용해야 합니다.
주요 제한사항은 다음과 같습니다.
- Linux 5.3+ 전용: 특정 커널 버전 이상에서만 작동합니다.
- macOS 미지원: Linux 전용 API입니다.
- PID 네임스페이스 제한: 동일한 PID 네임스페이스 내의 프로세스만 모니터링 가능합니다.
- 그룹 작업/자손 추적: 직접적인 그룹 시그널링이나 자손 프로세스 자동 추적은 지원하지 않으므로 수동 구현이 필요합니다.