
Ist es überhaupt möglich, das herauszufinden? Vielleicht müssen bestimmte Tests durchgeführt werden, um diese Information herauszufinden?
Mein System scheint, gleich nachdem ich mich angemeldet habe, die max_pid bereits umschlossen zu haben, sodass eine noch aktive PID die gleiche PID wie ein alter Prozess hat (was eines meiner Skripte durcheinander bringt...)! Ich versuche zu verstehen, was passiert und ob es dafür eine Lösung gibt...
meine /proc/sys/kernel/pid_max
ist 32768
Antwort1
Es ist nicht möglich zu sagen, wie oft der pid_max
Umbruch aufgetreten ist. Eine Möglichkeit, den Umbruch zu vermeiden, besteht darin, den Wert innerhalb pid_max
zu erhöhen .pid_max
cat /proc/sys/kernel/pid_max
Der obige Befehl gibt Ihnen die maximal verfügbaren Prozesse in Ihrem System an. Sie können den max_pid-Wert wie folgt erhöhen:
echo 4194303 > /proc/sys/kernel/pid_max
oder auch,
sysctl -w kernel.pid_max=4194303
Sie müssen jedoch untersuchen, ob es Prozesse gibt, die derzeit den Speicher nutzen.
ps -A
Sie können entweder oder ausführen ps -e
, um zu sehen, welche Prozesse gegenwärtig den Arbeitsspeicher Ihres Systems nutzen.
Warum lässt sich der Wrap nicht bestimmen?
AusDasAntwort,
Die meisten Systeme zählen einfach die zuletzt generierten PIDs, fügen eine hinzu (mit einem Umbruch bei einer Höchstzahl wie 65535 oder etwas kleiner – häufig erfolgt der Umbruch bei 65000 oder sogar 60000) und prüfen, ob die Zahl aktuell nicht verwendet wird (was wiederholt wird, wenn die PID noch verwendet wird – also ist PID 1, der Kernel, noch da und wird nicht „erneut ausgegeben“).
Andere sicherheitsorientierte Systeme generieren eine zufällige Nummer und prüfen, ob diese nicht verwendet wird.
Es ist jederzeit garantiert, dass alle PID-Nummern eindeutig sind.
Selbst wenn pid_max
also erreicht ist, haben Sie möglicherweise noch einige PIDs, die derzeit nicht verwendet werden, und das System kann diese PIDs weiterhin verwenden. Soweit ich weiß, können Sie nur dann feststellen, dass Sie keine PIDs mehr haben, wenn ein Fehler auftritt, wie dieserKommentarsagt,
Wenn Sie Prozesse > pid_max haben, erhalten Sie eine Fehlermeldung wie „Keine weiteren Prozesse …
Antwort2
Dieser Code ist möglicherweise für die meisten gängigen Situationen präzise genug:
#!/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
Mögliche Mängel:
Wenn pidMax über pidPrev hinaus erhöht wird, schlägt es fehl.
Wenn die Ruheverzögerung zu hoch ist, kann es ebenfalls fehlschlagen.
Es muss laufen, wenn die Maschine gestartet wird, und darf nicht gestoppt/neu gestartet werden, sonst verliert die Zählung ihre Bedeutung.
Einschränkungen:
Dieses Skript funktionierte hier auf Ubuntu 14.04 64bits, aber durchRameshs AntwortMöglicherweise stellen Sie fest, dass es auf Ihrem System nicht funktioniert, wenn die einem neuen Prozess zugewiesene PID zufällig ist.
Antwort3
Ist dort einxy-Problemdas hier angesprochen werden muss? In der Frage wird erwähnt
eine noch aktive PID hat dieselbe PID wie ein alter Prozess (was eines meiner Skripte durcheinanderbringt ...)
Wie werden die Skripte dadurch durcheinandergebracht? Liegt es daran, dass Sie die PID eines Prozesses in eine Datei schreiben, sich aber später herausstellt, dass der Prozess abgeschlossen ist und nun einige andere Skripte auf die „falsche“ PID verweisen?
Darüber hinaus sind alle PID-Nummern eindeutig (siehe das Zitat in Rameshs Antwort).