Вопрос или проблема
Я сталкиваюсь с проблемой, когда команда less
использует 100% одного ядра ЦП после отключения SSH-сессии. Ниже приведены подробные шаги для воспроизведения этого поведения:
-
Войдите на сервер:
ssh john@server-example
-
Переключитесь на другого пользователя:
sudo su - testuser
-
Откройте файл с помощью
less
:less /var/log/somefile.log
-
Включите режим прокрутки вперед (
F
): (Этот режим непрерывно мониторит файл, аналогичноtail -f
.) -
Резко завершите SSH-сессию (на стороне клиента):
- Используя последовательность ухода SSH:
Enter ~ .
, или завершив процесс SSH на клиентской машине.
- Используя последовательность ухода SSH:
После отключения SSH-сессии процесс less
остается активным на сервере и использует 100% ЦП. При проверке с помощью ps -ef
вывод показывает:
testuser 9930 9906 35 22:54 ? 00:02:05 less /var/log/somefile.log
Дополнительная информация:
- Это поведение происходит только после переключения пользователей (например, с
john
наtestuser
). - Если я запускаю
less
непосредственно от имени пользователяjohn
, процессless
завершается как ожидалось, когда отключается SSH-сессия. - Файл журнала небольшой и статический (в него не записываются новые данные).
- Настройка
huponexit
: Я пытался включитьshopt -s huponexit
как в начальной SSH-сессии, так и после переключения пользователей (sudo su - testuser
), но это не решает проблему. - Детали окружения:
- ОС: Gentoo Linux
- Система инициализации: OpenRC
Почему less
попадает в состояние высокого использования ЦП, когда SSH-сессия отключается после переключения пользователей?
Существует ли способ автоматически завершать процессы, такие как less
, когда пользовательская сессия завершается, особенно после переключения пользователей?
Буду признателен за любые советы или предложения!
Ответ или решение
Высокая загрузка CPU с использованием less в режиме прокрутки (F) после отключения SSH на Gentoo Linux (OpenRC)
Проблема с высокой загрузкой процессора, которую вы наблюдаете при использовании команды less
, когда SSH-сессия прерывается, является довольно распространенной и может быть вызвана особенностями управления процессами в Linux, особенно при использовании sudo
для смены пользователей.
Причины возникновения проблемы
Когда вы входите в систему как john
и затем переключаетесь на testuser
, процесс less
, запущенный от имени testuser
, становится "приросшим" к терминалу, связанному с SSH-сессией. Когда SSH-клиент завершает сессию, он не уведомляет об этом процессы, запущенные на сервере, которые были запущены от имени другого пользователя. Это приводит к тому, что less
продолжает работать, ожидая ввода, и в зависимости от настроек может начать потреблять 100% от одного ядра процессора.
Конкретно в вашем случае, использование режима прокрутки (F) заставляет less
постоянно активным, ожидая новых данных, даже когда лог-файл, к которому он обращается, не изменяется. Это объясняет высокую загрузку CPU.
Причины исключения поведения для пользователя john
Когда вы запускаете less
напрямую как john
, выполнение команды нормально завершается, потому что процесс получает сигнал от SSH, что сессия отключена. Однако процесс less
, запущенный от имени другого пользователя (как testuser
), не получает этого сигнала, что и приводит к бесконечному циклу ожидания.
Решение проблемы
-
Настройка huponexit: Хотя вы уже пробовали включить
shopt -s huponexit
, это не всегда срабатывает, особенно при использованииsudo su
, так какshopt
влияет только на текущую оболочку. Если необходимо, используйте прямую командуsu
с параметром-m
, чтобы сохранить окружение. -
Использование системных утилит: Рассмотрите возможность использования
nohup
илиdisown
для работы с такими процессами. Это избавит вас от контроля за процессом после выхода, но может не полностью решить вопрос. -
Замена less на tail: Иногда более опытные системные администраторы предпочитают использовать
tail -f
, потому что он автоматически завершается при отключении SSH, что исключает проблему с высоким использованием CPU. -
Написание скрипта для автоматизации выхода: Напишите bash-скрипт, который будет следить за событиями клиента SSH и автоматически завершит процессы
less
, запущенные неинтерактивно.
Заключение
Для устранения проблемы с высокой загрузкой CPU при использовании less
в режиме прокрутки (F) после отключения SSH-сессии, необходимо учитывать несколько факторов, включая управление процессами и корректные настройки окружения. Данные рекомендации помогут вам лучше управлять поведеними процессов при переходе между пользователями и сокрасят потери ресурсов системы.
Для дальнейших вопросов и рекомендаций, не стесняйтесь обращаться – вся необходимая информация по улучшению управления процессами крепко держится в профессиональном сообществе Linux администраторов.