Создание сценария автоматического запуска бездействия

Я хотел бы реализовать решение для конкретного экземпляра общей проблемы, когда незадействованные пользователи связывают ресурсы. Я знаю, что список пользователей может быть восстановлен с помощью 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 

Что здесь происходит:

  • Используйте w без заголовков, чтобы найти всех пользователей
  • Отфильтровывать корни
  • распечатать ttys, который является столбцом 2
  • для каждой строки, поиск для проверки времени доступа составляет более 5 минут
  • если это так, убейте все процессы на этом терминале с помощью pkill

Возможно, лучше использовать тайм-ауты оболочки для этого. Для экспортировать переменную TMOUT в bash как только для чтения

 TMOUT=<seconds>; readonly TMOUT; export TMOUT 

для использования tcsh

 set -r autologout <seconds> 

в сценариях в файле /etc/profile.d/. Оболочки, достигшие указанного таймаута, прекратятся. Выход из «w» не всегда точным (например, он не может сообщать время в x сеансах).

Если вы вошли в систему через ssh, используйте ClientAliveInterval (см. Sshd_config (5)).