最初に説明した問題に対する解決策を提示したい。ここ:
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).