脚本如何检测用户的空闲时间?

脚本如何检测用户的空闲时间?

我想在 bash 脚本中检查 X 会话的用户空闲了多长时间。

用户本人不必使用 bash,只需使用 X。例如,如果用户只是移动了鼠标,那么好的答案就是“空闲 0 秒”。如果他 5 分钟内没有碰过电脑,那么好的答案就是“空闲 300 秒”

不立即使用 xautolock 的原因是为了能够实现一些复杂的行为。例如,如果用户闲置了 10 分钟,则尝试暂停,如果用户闲置超过 5 分钟,则关闭(我知道这听起来很奇怪,但暂停在这里并不总是有效...)

答案1

刚刚找到了一个简单的方法。

有一个名为 xprintidle 的程序可以解决这个问题

获取空闲时间(以毫秒为单位)非常简单

xprintidle

并安装

apt-get install xprintidle

对于系统管理员来说,它也可以远程工作

ssh 会话

export DISPLAY=:0 && sudo -u john xprintidle

其中 john 是登录到远程机器上的 X 会话的用户。


请注意,某些程序(例如 MPlayer)似乎会重置计数器。

这可能是可取的,也可能不是,这取决于您的应用程序。对我来说,我打算用它来暂停计算机,而 MPlayer 异常很有帮助。

还有另一个答案(https://askubuntu.com/a/1303464/56440)对于那些不想重置的人来说,但我还没有亲自测试过

答案2

使用 josinalvo 的答案可能对某些人有用,但对我来说效果不太好,因为有些程序似乎定期重置计时器xprintidle出乎意料地依赖于此。此外,我也不希望全屏应用程序重置空闲计时器,至少在我的用例中不会。

因此,我将自己的解决方案组合在一个 shell 脚本中,该脚本不依赖于 X11 屏幕保护程序扩展。相反,它会转储xinput test-xi2 --root一秒钟内的所有用户输入,如鼠标移动和按键,然后将其与上一秒的转储进行比较。如果它们相同,则变量$t增加 1,否则重置。这是循环的,当变量$t超过阈值时$idletime,会打印用户处于空闲状态。

idleloop() {
    touch /tmp/.{,last_}input
    cmd='stat --printf="%s"'
    idletime=120
    a=2
    t=0
    while true
    do
        timeout 1 xinput test-xi2 --root > /tmp/.input
        
        if [[ `eval $cmd /tmp/.input` == `eval $cmd /tmp/.last_input` ]]
        then
            let t++ # increases $t by 1
        else
            t=0     # resets $t
        fi

        mv /tmp/.{,last_}input -f

        if [ $t -ge $idletime ] && [[ $a == "2" ]]
        then
            echo "user has gone idle"
            a=1
        fi
        if [ $t -lt $idletime ] && [[ $a == "1" ]]
        then
            echo "user has come back from idle"
            a=2
        fi
    done
}

idleloop

请随时留下任何建议。

答案3

来自的回答这里

在 bash 中

w | tr -s " " | cut -d" " -f1,5 | tail -n+3

为每个 shell 提供用户名/空闲时间对。因此,基本上你可以通过命令获取空闲信息w

答案4

这是一个完整的 bash 脚本,它检测用户/系统是否空闲 5 秒或更长时间,并将数据写入文件。借助另一个 bash 或 Python 脚本,我们可以对该文本文件进行更多分析。显然,我们可以根据需要更改这些值(idletime_threshold)。

/bin/bash #!/bin/bash
# 使用 dbus.sh 检测用户空闲繁忙时间

idletime_threshold=5000 # 以毫秒为单位
#idletime_threshold=300000 # 以毫秒为单位
a=2
输出=系统空闲繁忙.txt
空闲循环(){
    虽然正确
        睡眠 1 # 秒
        现在=`日期“+%Y-%m-%d%H:%M:%S”`
        get_idle_time=`dbus-send --print-reply --dest=org.gnome.Mutter.IdleMonitor /org/gnome/Mutter/IdleMonitor/Core org.gnome.Mutter.IdleMonitor.GetIdletime`
        idle_time=$(echo $get_idle_time | awk'{print $NF}')
        #echo "${idle_time}" # 毫秒

        如果 [ $idle_time -ge $idletime_threshold ] && [[ $a == "2" ]]
        然后
            回显“空闲:${now}”| tee -a $输出  
            a=1

        如果 [ $idle_time -lt $idletime_threshold ] && [[ $a == "1" ]]
        然后
            回显“忙:${now}”| tee -a $output  
            a=2
    完毕
}
空闲循环

输出:

u-20:〜/下载$ tailc -f system-idle-busy.txt
空闲 : 2022-09-15 14:20:00
忙碌 : 2022-09-15 14:20:02
空闲 : 2022-09-15 14:20:25
忙碌 : 2022-09-15 14:20:59
空闲 : 2022-09-15 14:23:48

相关内容