Если вы вообще не можете получить доступ к учетной записи, вам будет трудно выяснить, в чем проблема. Но проверьте системные журналы или журналы приложений, возможно, какая-то программа оставила там подсказку (особенно при неудачной попытке входа).
Если вы можете запускать программы для экспериментов, вы можете определить, какой предел был достигнут, попытавшись увеличить каждое ограниченное значение и увидев, когда это получается, а когда попытка терпит неудачу с EAGAIN
. Можно также перечислить ресурсы, используемые для каждого значения; я не могу вспомнить утилиту, которая собирает данные для всех ограничений, но, возможно, такая утилита существует.
Если предположить, что проблема заключается в ограничениях ядра, то они перечислены на странице setrlimit
man. Те, которые применяются для идентификатора пользователя:
RLIMIT_MEMLOCK
- размер незаменяемой памяти. Не должно препятствовать входу в систему, очень немногие программы запрашивают незаменяемую память. RLIMIT_MSGQUEUE
- размер очереди сообщений. Не должен препятствовать входу в систему, очень немногие программы используют очереди сообщений. RLIMIT_NPROC
- максимальное количество процессов. Этот параметр абсолютно будет препятствовать входу в систему, если он достигнут. Увеличение лимита в /etc/security/limits.conf
не повлияет на существующие сессии, но повлияет на новые процессы, поэтому если системный администратор увеличит значение там, пользователь сможет войти в систему. RLIMIT_SIGPENDING
- максимальное количество ожидающих сигналов. Не должно препятствовать входу в систему, очень немногие программы используют sigqueue
для зачисления сигналов. Так что наиболее вероятным является ограничение на процессы. Если у вас есть доступ к запущенной оболочке, вы можете подтвердить это, попытавшись запустить программу; ошибка должна быть довольно характерной:
$ 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
Вы можете вывести этот лимит с помощью ulimit -u
. Если у вас есть доступ к оболочке, запущенной от имени проблемного пользователя, и этот пользователь не запускал никакой setuid-программы, вы можете перечислить процессы, которые учитываются в этом лимите с помощью set /proc/*/task/*/cwd/.; echo $#
(перечисляются потоки ядра, для которых пользователь может читать ссылку cwd
, что означает, что пользователь имеет полный контроль над процессом).