처음에 설명한 문제에 대한 해결책을 제시하고 싶습니다.여기:
pkill
원자적 작업이 아닙니다. 멀리 떨어져 있습니다. pkill -P 666 foo는 pid 667이 foo라는 666의 하위임을 확인하므로(Linux에서는 /proc fs에서 여러 파일을 열고 읽어 이 작업을 수행합니다) 실제로 시스템에서 kill(2)을 호출할 때까지 호출되면 프로세스가 종료되었을 수 있으며 해당 pid가 재사용되었을 수 있습니다.
작업을 안전하게 만들기 위해 pkill -P XXX
(SQL의 트랜잭션과 같은) 구현하고 싶습니다.2단계 커밋 프로토콜:
- 프로세스가
THE_PARENT
프로세스의 하위인지 확인합니다. - "yes"인 경우 하위 프로세스의 PID를 "DO_NOT_REUSE"로 표시합니다.
- 프로세스가 여전히 프로세스의 하위인지 확인합니다
THE_PARENT
. - "yes"인 경우 하위 프로세스를 종료합니다(여전히 가능하다면).
DO_NOT_USE
이 PID 번호의 플래그를 삭제합니다 .
이 목적으로 PID 번호를 "사용할 수 없음"으로 표시할 수 있습니까?
답변1
커널은 "랩어라운드"될 때까지 pid를 재사용하지 않습니다.
cat /proc/sys/kernel/pid_max
4194304
( 내 시스템에서) 을 사용하여 pid_max를 확인할 수 있습니다 .
따라서 프로세스 종료 중에 PID가 재사용될 가능성은 거의 없습니다.
/proc/sys/kernel/pid_max (since Linux 2.5.34) This file specifies the value at which PIDs wrap around (i.e., the value in this file is one greater than the maximum PID). PIDs greater than this value are not allocated; thus, the value in this file also acts as a system-wide limit on the total number of processes and threads. The default value for this file, 32768, results in the same range of PIDs as on ear‐ lier kernels. On 32-bit platforms, 32768 is the maximum value for pid_max. On 64-bit systems, pid_max can be set to any value up to 2^22 (PID_MAX_LIMIT, approximately 4 million).