nproc byl problém:
[[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 limited.conf uvádí:
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.
Zdá se mi, že nproc je vynucován pouze na přihlášení, ale počítá se globálně. Takže přihlášení s nproc 8192 a 5000 vlákny by nemělo problémy, ale současné přihlášení stejného UID s nproc 4096 a 50 vlákny by nemohlo vytvořit více, protože globální počet (5050) je nad jeho nastavením nproc.
[[email protected] ~]# ps -eLf | grep pascal | grep google/chrome | wc -l
3792
Pokud se k účtu vůbec nedostanete, jen těžko zjistíte, v čem je problém. Ale zkontrolujte systémové nebo aplikační protokoly, doufejme, že tam nějaký program zanechal stopu (zejména pro neúspěšný pokus o přihlášení).
Pokud můžete spouštět programy k experimentování, můžete zjistit, jakého limitu bylo dosaženo, tím, že se pokusíte zvýšit každou limitovanou hodnotu a uvidíte, kdy to funguje a kdy se pokus nezdaří pomocí EAGAIN
. Je také možné uvést zdroje použité pro každou hodnotu; Nenapadá mě nástroj, který by shromažďoval data pro všechny limity, ale jeden může existovat.
Za předpokladu, že problémem je limit jádra, jsou uvedeny v setrlimit
manuálová stránka. Ty, které se vztahují na ID uživatele, jsou:
RLIMIT_MEMLOCK
— velikost nevyměnitelné paměti. Nemělo by bránit přihlášení, jen velmi málo programů vyžaduje nevyměnitelnou paměť.RLIMIT_MSGQUEUE
— velikost front zpráv. Nemělo by bránit přihlášení, jen velmi málo programů používá fronty zpráv.RLIMIT_NPROC
— maximální počet procesů. Tohle naprosto bude zabránit přihlášení, pokud je dosaženo. Zvýšení limitu na/etc/security/limits.conf
neovlivní stávající relace, ale ovlivní nové procesy, takže pokud správce systému zvýší hodnotu tam, uživatel se bude moci přihlásit.RLIMIT_SIGPENDING
— maximální počet čekajících signálů. Nemělo by bránit přihlášení, velmi málo programů používásigqueue
zařadit signály do fronty.
Omezení procesů je tedy nejpravděpodobnější. Pokud máte přístup ke spuštěnému shellu, můžete to potvrdit pokusem o spuštění programu; chyba by měla být docela výrazná:
$ 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
Tento limit si můžete vytisknout pomocí ulimit -u
. Pokud máte přístup k shellu spuštěnému jako problematický uživatel a uživatel nespustil žádný setuid program, můžete vypsat procesy, které se započítávají do tohoto limitu pomocí set /proc/*/task/*/cwd/.; echo $#
(uvádí vlákna jádra, pro která může uživatel číst cwd
odkaz, což znamená, že uživatel má plnou kontrolu nad procesem).