Я нашел несколько вопросов об этом, но я, может казаться, не нахожу тот, который удовлетворяет моим потребностям.
Я хотел бы свою машину (Xubuntu 16.04) к выключению питания, если я не использую его в течение 30 минут. Однако я использую его для потоковых видео к моему медиацентру (через сервер Samba), таким образом, я не хочу, чтобы это закрылось в этом случае.
Все ответы, которые я нашел, игнорируют сетевую активность и только фокусируются на перемещениях мыши и нажатиях клавиш.
Я настроил свое собственное задание крона для контакта с этим.
Приостанавливать/закрывать машину, если это было неактивно (никакие нажатия клавиш или перемещения мыши) для определенного количества времени, если нет файлы, получаемые доступ в его сервере Samba.
root
доступ.xprintidle
(установите его путем выполнения в терминале: sudo apt-get install xprintidle
)Сохраните следующий сценарий в месте по Вашему выбору (в моем случае, /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
.
Удостоверьтесь, что Вы делаете это исполняемым файлом:
chmod +x/home/user/.useful-scripts/idle.sh
Настройте задание для выполнения периодически использования cron
. smbstatus
требует, чтобы быть выполненным как root
, таким образом, мы должны вызвать crontab
использование sudo
:
sudo crontab-e
Добавьте следующую строку для запущения скрипта периодически:
* * * * */home/user/.useful-scripts/idle.sh
Это настраивает задание крона, чтобы работать каждую минуту и выполнить наш сценарий. Можно настроить периодичность к более высокому значению, если Вы не заботитесь о меньшей точности (см. эту ссылку для получения дополнительной информации о необходимом синтаксисе).
Это - это. cron
будет проверять состояние ожидания машины каждую минуту, и если это было неактивно больше 20 минут (может быть скорректирован с IDLE_LIMIT_MS
переменная) это удостоверится, что ни к каким файлам не получают доступ через сервер Samba; в этом случае это приостановит машину.
Можно работать (очень низко на соке) фоновый сценарий, который приостановит компьютер, округленный на 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
ifconfig
). Если это превышает определенную сумму, "счетчик" обнуляется, еще a0 секунды добавляется к "потоку" - время простоя.xprintidle
Если оба превышают время набора (в заголовке сценария), компьютер помещается в сон.
Потребности сценария xprintidle
sudo apt-get xprintidle
Скопируйте сценарий в пустой файл, сохраните его как set_idle.py
Тест - rfun это командой:
python3 /path/to/set_idle.py
Если все хорошо работает, добавьте его для Запущения Приложений.
Этот ответ предполагает, что трафик через соединение Ethernet. В противном случае функция get_packets()
возможно нуждается в маленьком редактировании.