nproc adalah masalahnya:
[[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 Limit.conf menyatakan:
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.
Tampak bagi saya bahwa nproc hanya diberlakukan per login tetapi diperhitungkan secara global. Jadi login dengan nproc 8192 dan 5000 utas tidak akan mengalami masalah, tetapi login simultan dari UID yang sama dengan nproc 4096 dan 50 utas tidak akan dapat membuat lebih banyak karena jumlah global (5050) di atas pengaturan nproc-nya.
[[email protected] ~]# ps -eLf | grep pascal | grep google/chrome | wc -l
3792
Jika Anda tidak dapat mengakses akun sama sekali, Anda akan kesulitan menemukan masalahnya. Namun periksa log sistem atau aplikasi, semoga beberapa program meninggalkan petunjuk di sana (terutama untuk upaya masuk yang gagal).
Jika Anda dapat menjalankan program untuk bereksperimen, Anda dapat mengetahui batas mana yang telah dicapai dengan mencoba meningkatkan setiap nilai terbatas dan melihat kapan berhasil dan kapan upaya gagal dengan EAGAIN
. Dimungkinkan juga untuk membuat daftar sumber daya yang digunakan untuk setiap nilai; Saya tidak dapat memikirkan utilitas yang mengumpulkan data untuk semua batasan, tetapi mungkin ada satu.
Dengan asumsi bahwa masalahnya adalah batas kernel, itu tercantum dalam setrlimit
halaman manual. Yang berlaku per ID pengguna adalah:
RLIMIT_MEMLOCK
— ukuran memori yang tidak dapat ditukar. Seharusnya tidak mencegah masuk, sangat sedikit program yang meminta memori yang tidak dapat ditukar.RLIMIT_MSGQUEUE
— ukuran antrian pesan. Seharusnya tidak mencegah masuk, sangat sedikit program yang menggunakan antrean pesan.RLIMIT_NPROC
— jumlah maksimum proses. Yang ini pasti akan mencegah login jika tercapai. Meningkatkan batas dalam/etc/security/limits.conf
tidak akan memengaruhi sesi yang ada, tetapi akan memengaruhi proses baru, jadi jika administrator sistem meningkatkan nilainya di sana, pengguna akan dapat masuk.RLIMIT_SIGPENDING
— jumlah maksimum sinyal yang tertunda. Seharusnya tidak mencegah masuk, sangat sedikit program yang menggunakansigqueue
untuk mengantrekan sinyal.
Jadi batas proses adalah yang paling mungkin. Jika Anda memiliki akses ke shell yang sedang berjalan, Anda dapat mengonfirmasi dengan mencoba menjalankan program; kesalahannya harus sangat khas:
$ 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
Anda dapat mencetak batas ini dengan ulimit -u
. Jika Anda memiliki akses ke shell yang berjalan sebagai pengguna yang bermasalah, dan pengguna tersebut belum menjalankan program setuid apa pun, Anda dapat membuat daftar proses yang diperhitungkan terhadap batas ini dengan set /proc/*/task/*/cwd/.; echo $#
(mencantumkan utas kernel di mana pengguna dapat membaca cwd
link, yang berarti bahwa pengguna memiliki kendali penuh atas proses tersebut).