Я хотел бы реализовать решение для конкретного экземпляра общей проблемы, когда незадействованные пользователи связывают ресурсы. Я знаю, что список пользователей может быть восстановлен с помощью w
, связанного с ним PID с ps
и последнего шага с kill
. Однако я хотел бы автоматизировать этот процесс для тех пользователей, которые простаивали более часа.
Идея состоит в том, чтобы прочитать вывод w по строкам, выбрав те строки, которые содержат регулярное выражение [0-9]m
(поиск пользователей с временем простоя более 1: 00 м). Затем TTY, связанный с линией, извлекается и отправляется в ps -t
, выход которого содержит список PID для отправки kill -9
. Я просто не уверен, как объединить все это.
Последнее предупреждение: ничто, связанное с пользователем root, не интерпретируется.
w использует время доступа tty для определения того, насколько простаивает кто-то, это рассматривается в idletime (), который статёт файл tty и вычитает его айтм с текущего времени. pkill может использовать терминал в качестве фильтра для уничтожения процессов.
Итак, вы хотите убить всех, кто не является root и простаивает более 5 минут?
for t in `w -h | grep -v '^root' | awk '{print $2}'`; do find /dev/$t -amin +5 -exec pkill -t $t \; ; done
Что здесь происходит:
Возможно, лучше использовать тайм-ауты оболочки для этого. Для экспортировать переменную TMOUT в bash как только для чтения
TMOUT=<seconds>; readonly TMOUT; export TMOUT
для использования tcsh
set -r autologout <seconds>
в сценариях в файле /etc/profile.d/. Оболочки, достигшие указанного таймаута, прекратятся. Выход из «w» не всегда точным (например, он не может сообщать время в x сеансах).
Если вы вошли в систему через ssh, используйте ClientAliveInterval (см. Sshd_config (5)).