
甚至有可能知道這一點嗎?可能需要執行某種測試才能找到該資訊?
我的系統,在我登入後,似乎已經包裝了 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 -A
或ps -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 答案中的引用)。