기존 PID(Process ID) 기반 프로세스 관리는 여러 한계를 가집니다. PID는 재활용될 수 있어 ‘PID 재사용’ 문제를 야기하며, 이는 모니터링 도구의 오작동 및 보안 취약점으로 이어질 수 있습니다. Ruby의 시그널 핸들러는 프로세스당 전역으로 작동하여 SIGCHLD
처리 시 ‘시그널 경합 조건’을 발생시키며, 프로세스 트리 추적도 어렵습니다. 부모 사망 시 손자 프로세스가 init에 의해 고아 프로세스로 채택되는 문제도 존재합니다.
이에 대한 해결책으로 Linux 커널 5.3 이상에서 도입된 PFD(Process File Descriptor)가 제시됩니다. PFD는 프로세스에 대한 안정적인 참조를 제공하여 PID 재사용 문제로부터 자유롭고, 풀링(pollable) 기능을 통해 복잡한 비동기/이벤트 기반 프로세스 모니터링을 가능하게 합니다. 또한, PFD를 사용하면 경쟁 조건 없이 정확한 프로세스에 시그널을 전달할 수 있습니다. Ruby 자체에는 PFD 지원이 없지만, 발표자는 FFI(Foreign Function Interface) 라이브러리를 사용하여 Linux 시스템 콜(pidfd_open
, pidfd_send_signal
, waitid
)을 직접 호출함으로써 PFD 기능을 효과적으로 활용할 수 있음을 보여줍니다. 이를 통해 프로세스 생존 확인, 시그널 전송, 좀비 프로세스 정리 등 강력한 프로세스 관리 레이어를 구축할 수 있으며, 자식 프로세스에서 부모 프로세스의 PFD를 생성하여 부모의 생존 여부를 모니터링하는 것도 가능합니다.
그러나 PFD에도 한계점이 있습니다. Linux 5.3 이상에서만 지원되며, Mac OS에서는 사용 불가합니다. 동일 PID 네임스페이스 내 프로세스만 모니터링할 수 있고, 그룹 작업이나 자손 프로세스에 대한 자동 접근 기능도 지원하지 않아 직접 구현해야 합니다. 발표자는 PFD가 모든 상황에 대한 만능 해결책은 아니며, 대부분의 경우 PID 기반 솔루션으로 충분하다고 강조합니다. PFD는 주로 비직접 자식 프로세스 모니터링, 높은 프로세스 생성/종료 빈도를 가진 환경, 또는 가장 전문적인 API가 요구되는 엣지 케이스에서 유용하며, 장기 실행되는 시스템에는 오버킬일 수 있습니다.