nproc war das Problem:
[[email protected] ~]# ps -eLf | grep pascal | wc -l
4068
[[email protected] ~]# cat /etc/security/limits.d/20-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 4096
root soft nproc unlimited
[[email protected] ~]#
man limits.conf besagt:
Also, please note that all limit settings are set per login. They are
not global, nor are they permanent; existing only for the duration of
the session. One exception is the maxlogin option, this one is system
wide. But there is a race, concurrent logins at the same time will not
always be detected as such but only counted as one.
Es scheint mir, dass nproc nur pro Anmeldung erzwungen wird, aber global zählt. Eine Anmeldung mit nproc 8192 und 5000 Threads hätte also keine Probleme, aber eine gleichzeitige Anmeldung der gleichen UID mit nproc 4096 und 50 Threads würde keine weiteren erstellen können, da die globale Anzahl (5050) über ihrer nproc-Einstellung liegt.
[[email protected] ~]# ps -eLf | grep pascal | grep google/chrome | wc -l
3792
Wenn Sie überhaupt nicht auf das Konto zugreifen können, wird es Ihnen schwer fallen, herauszufinden, was das Problem ist. Aber überprüfen Sie System- oder Anwendungsprotokolle, hoffentlich hat irgendein Programm dort einen Hinweis hinterlassen (insbesondere für einen fehlgeschlagenen Anmeldeversuch).
Wenn Sie Programme zum Experimentieren ausführen können, können Sie feststellen, welche Grenze erreicht wurde, indem Sie versuchen, jeden begrenzten Wert zu erhöhen und mit EAGAIN
zu sehen, wann es funktioniert und wann der Versuch fehlschlägt . Es ist auch möglich, die für jeden Wert verwendeten Ressourcen aufzulisten; Ich kann mir kein Dienstprogramm vorstellen, das die Daten für alle Grenzwerte sammelt, aber es könnte durchaus eines geben.
Unter der Annahme, dass das Problem ein Kernel-Limit ist, sind diese in setrlimit
aufgeführt Manpage. Diejenigen, die pro Benutzer-ID gelten, sind:
RLIMIT_MEMLOCK
— Größe des nicht austauschbaren Speichers. Sollte die Anmeldung nicht verhindern, nur sehr wenige Programme fordern nicht austauschbaren Speicher an.RLIMIT_MSGQUEUE
— Größe der Nachrichtenwarteschlangen. Sollte die Anmeldung nicht verhindern, verwenden nur sehr wenige Programme Nachrichtenwarteschlangen.RLIMIT_NPROC
— maximale Anzahl von Prozessen. Dieser hier wird absolut Anmeldungen verhindern, wenn es erreicht ist. Erhöhung des Limits in/etc/security/limits.conf
wirkt sich nicht auf die bestehenden Sitzungen aus, aber auf neue Prozesse. Wenn der Systemadministrator also den Wert dort erhöht, kann sich der Benutzer anmelden.RLIMIT_SIGPENDING
— maximale Anzahl anstehender Signale. Sollte die Anmeldung nicht verhindern, verwenden nur sehr wenige Programmesigqueue
um Signale einzureihen.
Die Begrenzung auf Prozesse ist also die wahrscheinlichste. Wenn Sie Zugriff auf eine laufende Shell haben, können Sie dies bestätigen, indem Sie versuchen, ein Programm auszuführen. der Fehler sollte ziemlich eindeutig sein:
$ ls
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: Resource temporarily unavailable
Dieses Limit können Sie mit ulimit -u
ausdrucken . Wenn Sie Zugriff auf eine Shell haben, die als problematischer Benutzer ausgeführt wird, und der Benutzer kein setuid-Programm ausgeführt hat, können Sie mit set /proc/*/task/*/cwd/.; echo $#
die Prozesse auflisten, die auf dieses Limit angerechnet werden (Listet die Kernel-Threads auf, für die der Benutzer den cwd
lesen kann Link, was bedeutet, dass der Benutzer die volle Kontrolle über den Prozess hat).