Привет! В Linux PID может освободиться после завершения процесса и достаться другому. Если скрипт следит за процессом по PID, есть риск перепутать его с новым.
Для этого в Linux есть
pidfd_open() - системный вызов, который возвращает файловый дескриптор конкретного процесса.👨💻 В Python его можно использовать так:
import os
import select
fd = os.pidfd_open(1847)
poller = select.poll()
poller.register(fd, select.POLLIN)
poller.poll()
print("Процесс завершился")
os.close(fd)
Здесь
1847 - PID нужного процесса.os.pidfd_open() получает дескриптор, а poll() ждёт, пока процесс завершится. Не нужно постоянно проверять его существование или опрашивать /proc.🔎 Допустим, вы пишете watchdog, который должен дождаться завершения конкретного процесса. С обычным PID можно столкнуться с его повторным использованием. А открытый pidfd продолжает ссылаться на исходный процесс.
⚙️ Работает механизм начиная с Linux 5.3. При этом
pidfd_open() не решает проблему, если PID успели переиспользовать ещё до открытия дескриптора. Для собственных дочерних процессов pidfd лучше получать сразу при их создании.P.S. Через
pidfd_send_signal() можно также отправлять сигналы конкретному процессу, не рискуя попасть в другой из-за повторного использования PID.👍 Белый хакер
