Как скрипт может обнаружить время простоя пользователя?

Я хочу проверить внутри bash-скрипта, как долго пользователь X-сессии простаивает.

Сам пользователь не должен использовать bash, а просто X. Если пользователь, например, просто переместил мышь, хорошим ответом будет «простоя в течение 0 секунд». Если он не дотронулся до компьютера в течение 5 минут, хорошим ответом было бы «бездействовать в течение 300 секунд»

. Причина, по которой вы не можете сразу использовать xautolock, состоит в том, чтобы иметь возможность реализовать некоторые сложные действия. Например, если пользователь простаивает в течение 10 минут, попробуйте приостановить, если он простаивает более 5 минут, отключение (я знаю, это звучит странно, но приостановка не всегда работает здесь ...)

33
задан 8 December 2015 в 20:03

3 ответа

Просто нашел простой способ сделать это.

Существует программа под названием xprintidle, которая делает трюк

, чтобы получить время простоя (в миллисекундах) так же просто, как

xprintidle

и установить

apt-get install xprintidle
< hr>

Для системных администраторов он также работает удаленно

Из сеанса ssh :

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

, где john - зарегистрированный пользователь в сеанс X на удаленном компьютере.

0
ответ дан 8 December 2015 в 20:03

Ответ от здесь :

В bash

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

выдает пару имя пользователя / простой для каждой оболочки. Таким образом, в основном вы можете получить информацию о простое с помощью команды w

0
ответ дан 8 December 2015 в 20:03

Использование ответа josinalvo может сработать для некоторых, но не совсем так хорошо для Мне кажется, что некоторые программы неожиданно регулярно сбрасывают таймер, на который полагается xprintidle. Кроме того, я также не хотел бы, чтобы полноэкранное приложение сбрасывало таймер простоя, по крайней мере, не в моем случае использования.

Поэтому я собрал собственное решение в сценарии оболочки, который не зависит от расширения X11 Screen Saver. Вместо этого он выводит весь пользовательский ввод, такой как движения мыши и нажатия клавиш, используя 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

Не стесняйтесь оставлять любые предложения.

6
ответ дан 28 December 2020 в 19:12

Другие вопросы по тегам:

Похожие вопросы: