Я хочу выполнить команду, когда пользователь становится неактивным (система бездействует). Например:
echo "You started to be inactive."
Кроме того, когда пользователь снова становится активным (система больше не находится в режиме ожидания):
echo "You started to be active, again."
Мне нужен сценарий оболочки, который сделает это. Это возможно без таймера / интервала? Может быть, какие-то системные события?
Ответы:
Эта ветка на форумах ArchLinux содержит небольшую программу на C, которая запрашивает у xscreensaver информацию о том, как долго пользователь простаивал, это, похоже, очень близко к вашим требованиям:
Сохраните это как
getIdle.c
и скомпилируйте сполучить исполняемый файл
getIdle
. Эта программа печатает «простой» (пользователь не перемещается / не щелкает мышью, не использует клавиатуру) в миллисекундах, поэтому сценарий bash, основанный на этом, может выглядеть следующим образом:Это все еще требует регулярного опроса, но он делает все, что вам нужно ...
источник
xprintidle
, которая доступна в большинстве дистрибутивов и делает то же самое.TMOUT в bash завершит интерактивный сеанс через заданное количество секунд. Вы можете использовать этот механизм.
Вы перехватываете выход из системы, устанавливая соответствующую ловушку (я не проверял это) или используя сценарии bash-logout-scripts (~ / .bash_logout).
Вот хороший ответ суперпользователя в этом направлении.
источник
$TMOUT
нескольких секунд.EXIT
ловушки, либо из.bash_logout
.Это не совсем то, что вы просили, но всегда есть
batch
-команда (обычно это специальный вызовat
-команды и использованиеatd
-daemon).batch
позволяет настроить команду для запуска, когда средняя нагрузка падает ниже определенного предела (обычно 1,5, но это можно установить при запускеatd
). Приat
этом также возможно выполнить работу таким образом, чтобы она не выполнялась в определенное время; задание только что доставленоbatch
в это время и запускается сначала, когда средняя нагрузка падает (например, она запускается, как только средняя нагрузка падает ниже 1,5 через 2 часа ночи).К сожалению, пакетное задание будет работать до конца, оно не остановится, если компьютер больше не будет работать.
+++
Если вам нужно пойти по маршруту программирования (как это выглядит из других ответов), я думаю, я бы попытался создать нечто похожее на демоны
atd
илиcrond
, которые отслеживали бы зарегистрированных пользователей и / или среднюю загрузку. Затем этот демон может запускать скрипты / программы из определенного каталога и запускать / продолжать или останавливать их (с сигналами) по мере необходимости.источник
.lock
файлы, вы могли бы легко справиться с проблемами синхронизации.В этой теме есть несколько решений, основанных на обнаружении активности клавиатуры и мыши. Я бегу
xprintidle
от работы cron, которая запускается каждые несколько минут. Но, как они указывают,xprintidle
это не поддерживается, поэтому вы можете установить модуль Perl и использовать его вместо этого:Я бы использовал любое решение путем опроса cron, в сценарии, который выходит вверху, если пользовательский интерфейс не был достаточно простаивает. Конечно, сценарий понадобится для
export DISPLAY=:0.0
того, чтобы поговорить с X11.Помните, что ваша клавиатура и мышь могут быть неактивны при просмотре фильма или при выполнении задачи с большой нагрузкой на процессор.
источник
Я не знаю способа сделать это без опроса какой-либо статистики системы, например, в других ответах используется заставка или таймер простоя bash или запуск из .bash_logout, но вот идея проверить загрузку процессора.
Это по-прежнему будет включать опрос каждые n секунд, и если загрузка вашего ЦП будет ниже любой выбранной вами величины, вы можете написать сценарий для любого запуска. Тем не менее, все, что вы запускаете, может увеличить нагрузку на процессор, но вы можете использовать nice на своих «вещах», чтобы не считать их.
Вот тестовый скрипт с использованием top, но вы могли бы вместо этого использовать mpstat или проверить средние значения загрузки?
Это всего лишь сценарий, который я написал вместе, чтобы проверить чтение простаивающих сверху. Вы можете разобрать,
/proc/stat
но я думаю, что это показывает только общее время, и вам нужно сравнить результаты за интервал. У меня есть своя собственная проблема (linux mint 16), при первом запуске он, кажется, никогда не меняет cpustats, как будто ему нужно ждать, чтобы разобрать / proc / stat, поэтомуtop -bn2
теоретически этоtop -bn1
должно сработать.источник
w
команду, которая показывает время простоя пользователя. - Между прочим, я не осуждаю, просто для меня я хочу обнаружить холостой ход, чтобы перевести машину в режим сна, сэкономить электроэнергию, и опрос идет против этого.