如何確定pid_max包裹了幾次?

如何確定pid_max包裹了幾次?

甚至有可能知道這一點嗎?可能需要執行某種測試才能找到該資訊?

我的系統,在我登入後,似乎已經包裝了 max_pid,所以一個仍然活著的 pid 得到了與舊進程相同的 pid(這搞亂了我的一個腳本......)!我試圖了解發生了什麼以及是否有一些解決方法...

我的/proc/sys/kernel/pid_max是32768

答案1

無法判斷pid_max發生了多少次換行。避免遇到pid_max包裝的一種解決方法是增加pid_max內部的價值,

cat /proc/sys/kernel/pid_max

上面的指令會讓您知道系統中最大的可用進程數。您可以增加 max_pid 值,如下所示:

echo 4194303 > /proc/sys/kernel/pid_max

甚至,

sysctl -w kernel.pid_max=4194303

但是,您需要調查目前是否有某些進程正在使用記憶體。

您可以運行ps -Aps -e來查看目前有哪些進程正在使用系統記憶體。

為什麼無法確定包裹?

回答,

大多數系統只是保留最後產生的 PID 的計數,加一(以最大數字換行,例如 65535 或更小一點 - 通常換行發生在 65000 甚至 60000),並檢查該數字目前是否未在使用(如果PID 仍在使用中,則重複- 因此PID 1(內核)仍然存在並且不會「重新發布」)。

其他具有安全意識的系統隨機產生一個數字並檢查它是否未被使用。

在任何給定時間,保證所有 PID 號碼都是唯一的。

因此,即使pid_max達到了,您仍然可能有一些目前未使用的 pid,因此系統仍然可以使用這些 pid。據我所知,只有當你遇到這樣的錯誤時,你才能知道你的 pid 已經用完了評論說,

如果您的進程數> pid_max,您會收到類似「沒有更多進程...

答案2

對於大多數常見情況,此程式碼可能足夠精確:

#!/bin/bash
count=0;pidPrev=0;
while true;do
    echo -n & pidMax=$!;
    if((pidMax<pidPrev));then
        ((count++));
    fi;
    pidPrev=$pidMax;
    echo "$count,$pidMax";
    sleep 1;
done

可能的缺陷:
如果 pidMax 增加到超過 pidPrev,則會失敗。
如果睡眠延遲太高,它也可能會失敗。
它必須在機器啟動時運行,並且不能停止/重新啟動,否則計數將失去其意義。

限制:
這個腳本在這裡工作,在 Ubuntu 14.04 64 位元上,但透過拉梅什的回答如果分配給新進程的 pid 是隨機的,您可能會發現它無法在您的系統上工作。

答案3

有沒有一個XY問題這需要在這裡解決嗎?問題中提到了

一個仍然活著的 pid 得到了與舊進程相同的 pid(這搞亂了我的一個腳本......)

它如何擾亂腳本?是否因為您將進程的 PID 寫入文件,但後來發現該進程已完成,現在其他一些腳本引用了「錯誤」的 PID?

此外,所有 PID 號碼都是唯一的(請參閱 Ramesh 答案中的引用)。

相關內容