Завершение работы после неактивный (но не, если сервер Samba используется),

Я нашел несколько вопросов об этом, но я, может казаться, не нахожу тот, который удовлетворяет моим потребностям.

Я хотел бы свою машину (Xubuntu 16.04) к выключению питания, если я не использую его в течение 30 минут. Однако я использую его для потоковых видео к моему медиацентру (через сервер Samba), таким образом, я не хочу, чтобы это закрылось в этом случае.

Все ответы, которые я нашел, игнорируют сетевую активность и только фокусируются на перемещениях мыши и нажатиях клавиш.

1
задан 4 September 2016 в 23:40

2 ответа

Я настроил свое собственное задание крона для контакта с этим.

Чего я достиг

Приостанавливать/закрывать машину, если это было неактивно (никакие нажатия клавиш или перемещения мыши) для определенного количества времени, если нет файлы, получаемые доступ в его сервере Samba.

Требования

  • root доступ.
  • xprintidle (установите его путем выполнения в терминале: sudo apt-get install xprintidle)

Как к

  1. Сохраните следующий сценарий в месте по Вашему выбору (в моем случае, /home/user/.useful-scripts/idle.sh):

    #!/bin/bash
    
    # Checks the time the computer has been idle (no keystrokes or mouse moves)
    # If it's greater than the set limit, it will suspend the machine if no
    # files are being accessed through the SAMBA server.
    
    
    # The maximum number of milliseconds the computer is allowed to be idle before
    # it is suspended (set to 20 minutes)
    IDLE_LIMIT_MS=1200000
    
    # How long the machine has been idle for
    IDLE_TIME_MS=$(/sbin/runuser -l ic -c "DISPLAY=:0.0 /usr/bin/xprintidle")
    
    if [ $IDLE_TIME_MS -gt $IDLE_LIMIT_MS ] ;
    then
        # If there are no files locked by SAMBA, suspend the machine
        FILES_LOCKED=$(/usr/bin/smbstatus | /bin/grep 'Locked files:')
    
        if [[ -z "${FILES_LOCKED}" ]] ;
        then
            /bin/systemctl suspend -i
            # If you prefer to shut down instead of suspend, comment the
            # previous line and uncomment the following one:
            # /sbin/poweroff
        fi
    fi
    

    Знайте, что этот скрипт будет запущен cron. Это имеет определенные последствия, но главным образом это DISPLAY и PATH переменные среды не установлены. Поэтому мы должны дать полный путь при вызове команды. Пути могли бы измениться в Вашей машине, поэтому удостоверьтесь, что они соответствуют Вашей конфигурации (например, для нахождения пути для xprintidle выполнитесь в терминале which xprintidle).

    Мы также должны указать ДИСПЛЕЙ, для которого мы хотим xprintidleинформация. Это обычно :0.0, но можно быть уверены в этом путем выполнения w от терминала, в то время как зарегистрированный и проверки FROM столбец. Прочитайте эти три ссылки (1, 2 и 3) для получения дополнительной информации о PATH и DISPLAY под cron.

  2. Удостоверьтесь, что Вы делаете это исполняемым файлом:

    chmod +x/home/user/.useful-scripts/idle.sh

  3. Настройте задание для выполнения периодически использования cron. smbstatus требует, чтобы быть выполненным как root, таким образом, мы должны вызвать crontab использование sudo:

    sudo crontab-e

    Добавьте следующую строку для запущения скрипта периодически:

    * * * * */home/user/.useful-scripts/idle.sh

    Это настраивает задание крона, чтобы работать каждую минуту и выполнить наш сценарий. Можно настроить периодичность к более высокому значению, если Вы не заботитесь о меньшей точности (см. эту ссылку для получения дополнительной информации о необходимом синтаксисе).

Это - это. cron будет проверять состояние ожидания машины каждую минуту, и если это было неактивно больше 20 минут (может быть скорректирован с IDLE_LIMIT_MS переменная) это удостоверится, что ни к каким файлам не получают доступ через сервер Samba; в этом случае это приостановит машину.

1
ответ дан 7 December 2019 в 13:42

Можно работать (очень низко на соке) фоновый сценарий, который приостановит компьютер, округленный на 10 секундах:

#!/usr/bin/env python3
import time
import subprocess

# --- set idle time below (seconds)
idle_set = 1200
# ---

def get_packets():
    return int([l.strip().split()[1].replace("packets:", "") for l in \
            subprocess.check_output("ifconfig").decode("utf-8").splitlines()\
            if " RX " in l][0])

def get_idle():
    return int(int(subprocess.check_output("xprintidle").decode("utf-8").strip())/1000)

data1 = get_packets()
t = 0

while True:
    time.sleep(10)
    data2 = get_packets()
    if data2 - data1 > 3000:
        t = 0
    else:
        t += 10
    idletime = get_idle()
    if all([idletime > idle_set, t > idle_set]):
        subprocess.Popen(["systemctl", "suspend", "-i"])
    data1 = data2

Что это делает

  • Однажды в 10 секунд, это проверяет текущий полученный объем данных, сравнивая его с 10 секунд назад (использование ifconfig). Если это превышает определенную сумму, "счетчик" обнуляется, еще a0 секунды добавляется к "потоку" - время простоя.
  • Также однажды в 10 секунд это смотрит на "общее" время простоя, с помощью xprintidle

Если оба превышают время набора (в заголовке сценария), компьютер помещается в сон.

Как настроить

  1. Потребности сценария xprintidle

    sudo apt-get xprintidle
    
  2. Скопируйте сценарий в пустой файл, сохраните его как set_idle.py

  3. В главном разделе сценария, набор желаемое время простоя
  4. Тест - rfun это командой:

    python3 /path/to/set_idle.py
    

Если все хорошо работает, добавьте его для Запущения Приложений.

Примечание:

Этот ответ предполагает, что трафик через соединение Ethernet. В противном случае функция get_packets() возможно нуждается в маленьком редактировании.

1
ответ дан 7 December 2019 в 13:42

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

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