创建自动空闲进程终止脚本

创建自动空闲进程终止脚本

我想针对空闲用户占用资源的一般问题的特定实例实施解决方案。我知道可以使用 检索用户列表w,使用 检索关联的 PID ps,使用 检索最后一步kill。但是,我想为那些闲置超过一个小时的用户自动执行此过程。

这个想法是逐行读取 w 的输出,选择包含正则表达式的行[0-9]m(找到空闲时间大于 1:00m 的用户)。然后,提取与该线路关联的 TTY 并将其发送到ps -t,其输出包含要发送到 的 PID 列表kill -9。我只是不确定如何将所有这些串在一起。

最后警告:与 root 用户相关的任何内容都不会被解释。

答案1

为此,使用 shell 超时可能会更好。对于 bash 将 TMOUT 变量导出为只读

TMOUT=<seconds>; readonly TMOUT; export TMOUT

供 tcsh 使用

set -r autologout <seconds>

在 /etc/profile.d/ 中的脚本中。达到上述超时时间的 shell 将终止。 “w”的输出并不总是准确的(例如,它无法报告 x 个会话的时间)。

如果您有用户通过 ssh 登录,则使用 ClientAliveInterval(请参阅 sshd_config(5))。

答案2

w 使用 tty 的访问时间来确定某个人的空闲程度,这在idletime() 中有所涉及,它统计 tty 文件并从当前时间减去其 atime。 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 查找所有用户
  • 过滤掉根
  • 打印出第 2 列的 ttys
  • 对每一行做一个find测试访问时间是否超过5分钟
  • 如果是,则使用 pkill 杀死该终端上的所有进程

相关内容