Существует несколько вещей, которые необходимо рассмотреть:
Самая важная вещь состоит в том, чтобы автоматизировать все максимально хорошее. Необходимо использовать систему управления конфигурацией как марионетка или шеф-повар, потому что это упрощает и автоматизирует развертывание новых систем, например, просто необходимо выполнить марионетку однажды, и сервер настраивается как производственная система.
Эта ветка на форумах ArchLinux содержит короткую программу на C, которая запрашивает у xscreensaver информацию о том, как долго пользователь бездействовал, это похоже на довольно близко к вашим требованиям:
#include <X11/extensions/scrnsaver.h>
#include <stdio.h>
int main(void) {
Display *dpy = XOpenDisplay(NULL);
if (!dpy) {
return(1);
}
XScreenSaverInfo *info = XScreenSaverAllocInfo();
XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), info);
printf("%u\n", info->idle);
return(0);
}
Сохраните это как getIdle.c
и скомпилируйте с
gcc -o getIdle getIdle.c -lXss -lX11
, чтобы получить исполняемый файл getIdle
. Эта программа печатает «время простоя» (пользователь не перемещает / щелкает мышью, не использует клавиатуру) в миллисекундах, поэтому сценарий bash, основанный на этом, может выглядеть следующим образом:
#!/bin/bash
idle=false
idleAfter=3000 # consider idle after 3000 ms
while true; do
idleTimeMillis=$(./getIdle)
echo $idleTimeMillis # just for debug purposes.
if [[ $idle = false && $idleTimeMillis -gt $idleAfter ]] ; then
echo "start idle" # or whatever command(s) you want to run...
idle=true
fi
if [[ $idle = true && $idleTimeMillis -lt $idleAfter ]] ; then
echo "end idle" # same here.
idle=false
fi
sleep 1 # polling interval
done
Это все еще требует регулярного опроса, но он делает все, что вам нужно ...
Это не совсем то, что вы просили, но всегда есть команда batch
(обычно это специальный вызов команды at
и использование atd
-демон).
batch
позволяет вам активировать команду, которая будет запускаться, когда средняя нагрузка упадет ниже определенного предела (обычно 1,5, но это можно установить при запуске atd
). С помощью в
также можно запустить задание таким образом, что вместо того, чтобы запускаться в определенное время; задание только что доставляется в пакет
в это время и сначала запускается, когда средняя нагрузка падает (например, оно запускается, как только средняя нагрузка падает ниже 1,5 где-то после 2:00).
К сожалению, пакетное задание будет выполнено до конца, оно не остановится, если компьютер больше не простаивает.
+++
Если вам нужно пойти по маршруту программирования (который выглядит из других ответов), я думаю, что я бы попытался сделать что-то похожее на atd
или демоны crond
, которые отслеживали вошедших в систему пользователей и / или среднюю нагрузку. Затем этот демон может запускать сценарии / программы из определенного каталога и запускать / продолжать или останавливать их (с сигналами) по мере необходимости.
Я не знаю, как это сделать, не опросив некоторых своего рода системная статистика, например, в других ответах используется заставка или таймер простоя bash или запуск из .bash_logout, но здесь есть идея проверить использование ЦП.
Это все равно будет включать опрос каждые n секунд, и если ваш процессор загружен ниже любого выбранного вами количества, вы можете создать скрипт, который хотите запустить. Однако все, что вы запускаете, может увеличить загрузку ЦП, но вы можете использовать nice в своих «материалах», чтобы не считать это.
Вот тестовый сценарий с использованием top, но вы могли бы использовать вместо него mpstat или вместо этого проверять среднюю нагрузку?
while true
do
idle=$(top -bn2 | grep "Cpu(s)"|tail -n 1|sed "s/.*, *\([0-9.]*\)%* id.*/\1/")
echo "idle is $idle"
if [[ $idle > 90 ]]
then
echo "idle above 90%"
echo "Do stuff now"
else
echo "idle below 90%"
echo "Stop doing stuff now"
fi
sleep 1
done
Это просто сценарий, который я собрал вместе, чтобы проверить чтение простоя сверху. Вы можете разобрать / proc / stat
, но я думаю, что он показывает только общее время, и вам нужно будет сравнивать результаты за интервал. У Top есть своя проблема для меня (linux mint 16), при первом запуске кажется, что он никогда не меняет cpustats, как будто ему приходится ждать, чтобы проанализировать сам / proc / stat, отсюда top -bn2
, но теоретически top -bn1
должен работать.
TMOUT в bash завершит интерактивный сеанс через заданное количество секунд. Вы можете использовать этот механизм.
Вы мигрируете и фиксируете выход из системы, устанавливая соответствующую ловушку (я не проверял это) или используя сценарии bash-logout (~ / .bash_logout).
В этом потоке есть несколько решений, основанных на обнаружении активности клавиатуры и мыши. Я запускаю xprintidle
из задания cron, которое запускается каждые несколько минут. Но, как они отмечают, xprintidle
не поддерживается, поэтому вы можете установить модуль Perl и использовать его вместо этого:
$ cpanm X11::IdleTime
...
$ sleep 10; perl -MX11::IdleTime -le 'print GetIdleTime()'
9
Я бы использовал любое решение, опросив cron, в сценарии, который выходит наверху если пользовательский интерфейс недостаточно простаивает. Конечно, скрипту потребуется export DISPLAY =: 0.0
, чтобы взаимодействовать с X11.
Помните, что ваша клавиатура и мышь могут быть неактивными при просмотре фильма или выполнении задачи, загружающей процессор.