Вопрос или проблема
На одном из моих серверов с Gentoo linux я заметил активную сессию пользователя, которая, кажется, зависла. Когда я запускаю команду w, вывод показывает следующее:
w
22:21:01 работает 80 дней, 1:15, 3 пользователя, средняя загрузка: 0.21, 0.31, 0.38
ПОЛЬЗОВАТЕЛЬ TTY ВХОД@ ОТКАЗ JCPU PCPU ЧТО
root pts/0 21:09 3.00s 0.03s 0.01s sshd: root [priv]
root pts/1 22:19 3.00s 0.04s 0.01s sudo su -
joe pts/3 Wed09 0.00s 0.00s 0.06s sudo su - application_user
Пользователь joe по-видимому, зашел в систему на pts/3 в среду в 09:00. Однако, когда я запускаю ps -ft pts/3, я получаю следующее:
ps -ft pts/3
ошибка: TTY не найден
Я проверил процессы пользователя с помощью ps -u joe
, текущие процессы, связанные с этим пользователем, отсутствуют.
ps -e -o pid,tty,user,cmd --sort=tty
, и под pts/3 процессы не запущены, я вижу только мои pts/0 и pts/1 в списке.
Перечисленные открытые файлы с использованием lsof -u joe
, также без результатов.
Вот /dev/pts
ls -l /dev/pts
всего 0
crw--w---- 1 root tty 136, 0 Июн 30 22:41 0
crw--w---- 1 root tty 136, 1 Июн 30 22:41 1
c--------- 1 root root 5, 2 Апр 11 21:06 ptmx
Ни один из этих шагов не показывает процессов или сессий, связанных с joe или pts/3.
В ходе дальнейшего расследования (на основе команды w) я установил, что joe переключился на application_user (учетная запись приложения, используемая для запуска службы), а затем с этой учетной записи он подключился через ssh к другому серверу. В какой-то момент joe отключился (я предполагаю, что его VPN остановился, поскольку существует временное ограничение для каждого соединения), но процессы, которые он запустил, не завершились полностью.
Список всех процессов “sudo su – application_user”
ps -ef | grep "sudo su - application_user" (это команда, указанная как последняя команда пользователем joe в выводе w)
root 26881 1 0 Июн26 ? 00:00:00 sudo su - application_user
root 26989 26881 0 Июн26 ? 00:00:00 sudo su - application_user
root 26990 26989 0 Июн26 ? 00:00:00 su - application_user
ps -ef | grep 26990
root 26990 26989 0 Июн26 ? 00:00:00 su - application_user
application_user 26992 26990 0 Июн26 ? 00:00:00 -bash
ps -ef | grep 26992
application_user 26992 26990 0 Июн26 ? 00:00:00 -bash
application_user 30391 26992 0 Июн26 ? 00:00:00 ssh foo@remote_server_02
Если я убью эти процессы (ssh, bash…), пользователь joe будет выведен из системы.
Мой вопрос: Существует ли лучший (и более предсказуемый) способ определить, какие процессы запущены пользователем joe? Моя процедура выше основана на поиске последней команды, запущенной пользователем joe, но между joe и первым “sudo su – application_user”, который запущен root под идентификатором родительского процесса 1, нет прямой связи (ни по имени пользователя, ни по pts/3).
И второй вопрос: почему это происходит, почему команда w и who показывает, что joe вошел в систему, если нет процессов или pts, которые им используются?
.
Ответ или решение
Вопрос о сессии пользователя, показываемой командами w
и who
, но при этом отсутствующей в TTY
, требует глубокого анализа устройства процессов и управления сеансами в Linux. Рассмотрим вашу ситуацию более подробно.
Ситуационная справка
На вашем сервере Gentoo вы наблюдаете сессию пользователя joe
, которая, согласно выводу команды w
, активна на pts/3
с момента среды в 09:00. При этом попытка использования команды ps -ft pts/3
приводит к ошибке: "TTY could not be found", что указывает на несуществующую или закрытую терминальную сессию.
Практически все проверки, которые вы провели, не выявили активных процессов, связанных с пользователем joe
на pts/3
, что вызывает несколько вопросов.
Причины проблемы
-
Зависшие сессии: Судя по вашему описанию, причиной проблемы может быть зависшая сессия, возникшая в результате нестабильного соединения, возможно, из-за временной потери VPN-сигнала. Когда соединение прерывается, но процессы продолжают существовать, система может показывать пользователя как активного, даже если он фактически не подключен.
-
Проблема с TTY: Точки монтирования для виртуальных терминалов (как
pts/
) управляются черезdevpts
. Если терминальный пул, из которого происходитpts
, был освобожден (или потерян), но процессы все еще существуют, система может сообщать, что TTY отсутствует, хотя процессы пользователей лежат в памяти.
Рекомендации по определению активных процессов
Для более детального анализа активных процессов пользователя joe
я рекомендую использовать несколько способов:
-
Проверка по родителям процессов: Используйте команду
pstree
для наглядного представления древовидной структуры процессов. Это позволит увидеть все дочерние процессы, относящиеся кsudo su - application_user
, что упрощает дальнейшие действия.pstree -pu | grep joe
-
Применение
lsof
к процессам: Использованиеlsof
в сочетании с идентификатором процесса (PID) может помочь понять, какие файловые дескрипторы открыты и какие соединения активны.lsof -p <PID>
-
Использование инструмента
pgrep
: Инструментpgrep
может помочь фильтровать процессы по именам или другим критериям, включая родительский процесс (PPID).pgrep -af "sudo su - application_user"
Почему w
и who
показывают пользователя как активного?
Команды w
и who
опираются на информацию о текущих сеансах, которая может храниться даже после завершения процессов, особенно в случае некорректного отсоединения. Эти команды проверяют записи в системных таблицах, которые могут указывать, что сессия все еще активна, если система не обновила данные после отключения по причинам, связанным с состоянием ресурса pts
.
Заключение
Ваша проблема с отображением пользователя joe
в системных утилитах, несмотря на отсутствие активных процессов, может быть результатом зависшей сессии или некорректного завершения сеанса. Для лучшего отслеживания процессов в будущем стоит рассмотреть возможности улучшенной мониторинга и управления сессиями, а также применение дополнительных инструментов для анализа.
Устранение таких проблем требует внимательного анализа и проверки, поэтому всегда стоит быть на чеку и отслеживать активные соединения и процессы, чтобы избежать подобных конфликтов.