Выполните команду, когда система неактивна и когда активно снова

Существует несколько вещей, которые необходимо рассмотреть:

  • Начните использовать Непрерывное Интегрирующее программное обеспечение для создания Вашего программного обеспечения, например, Jenkins, Buildbot или других вещей.
  • Создайте выделенные репозитории для своих этапов - на основе Вашего комментария, он может помочь к развертыванию, по крайней мере, для dev и возможно протестировать этап через Ваш инструмент CI и для более поздних этапов через автоматические обновления.
  • Используйте что-то как выход в открытый космос или необслуживаемые обновления или подобные инструменты, чтобы усовершенствовать Ваши системы. Не используйте ручные сценарии крона или вход в систему в систему. Можно также использовать марионетку вместо выхода в открытый космос, чтобы гарантировать, чтобы у Вас была последняя версия установленного пакета.
  • Используйте марионетку/шеф-повара / … для спецификации пакета и конфигурации. Вы можете, например, простой указывать, чтобы установить последнюю версию пакета с марионеткой или добавить определенный репозиторий ко всем Вашим серверам тестирования и т.д.

Самая важная вещь состоит в том, чтобы автоматизировать все максимально хорошее. Необходимо использовать систему управления конфигурацией как марионетка или шеф-повар, потому что это упрощает и автоматизирует развертывание новых систем, например, просто необходимо выполнить марионетку однажды, и сервер настраивается как производственная система.

15
22.03.2014, 21:49
5 ответов

Эта ветка на форумах 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

Это все еще требует регулярного опроса, но он делает все, что вам нужно ...

17
27.01.2020, 19:49

Это не совсем то, что вы просили, но всегда есть команда batch (обычно это специальный вызов команды at и использование atd -демон).

batch позволяет вам активировать команду, которая будет запускаться, когда средняя нагрузка упадет ниже определенного предела (обычно 1,5, но это можно установить при запуске atd ). С помощью в также можно запустить задание таким образом, что вместо того, чтобы запускаться в определенное время; задание только что доставляется в пакет в это время и сначала запускается, когда средняя нагрузка падает (например, оно запускается, как только средняя нагрузка падает ниже 1,5 где-то после 2:00).

К сожалению, пакетное задание будет выполнено до конца, оно не остановится, если компьютер больше не простаивает.

+++

Если вам нужно пойти по маршруту программирования (который выглядит из других ответов), я думаю, что я бы попытался сделать что-то похожее на atd или демоны crond , которые отслеживали вошедших в систему пользователей и / или среднюю нагрузку. Затем этот демон может запускать сценарии / программы из определенного каталога и запускать / продолжать или останавливать их (с сигналами) по мере необходимости.

3
27.01.2020, 19:49

Я не знаю, как это сделать, не опросив некоторых своего рода системная статистика, например, в других ответах используется заставка или таймер простоя 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 должен работать.

1
27.01.2020, 19:49

TMOUT в bash завершит интерактивный сеанс через заданное количество секунд. Вы можете использовать этот механизм.

Вы мигрируете и фиксируете выход из системы, устанавливая соответствующую ловушку (я не проверял это) или используя сценарии bash-logout (~ / .bash_logout).

Вот хороший ответ суперпользователя в этом направлении.

3
27.01.2020, 19:49

В этом потоке есть несколько решений, основанных на обнаружении активности клавиатуры и мыши. Я запускаю xprintidle из задания cron, которое запускается каждые несколько минут. Но, как они отмечают, xprintidle не поддерживается, поэтому вы можете установить модуль Perl и использовать его вместо этого:

$ cpanm X11::IdleTime
...
$ sleep 10; perl -MX11::IdleTime -le 'print GetIdleTime()'
9

Я бы использовал любое решение, опросив cron, в сценарии, который выходит наверху если пользовательский интерфейс недостаточно простаивает. Конечно, скрипту потребуется export DISPLAY =: 0.0 , чтобы взаимодействовать с X11.

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

2
28.07.2021, 14:12

Теги

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