Вопрос Можно ли положить X в сон, оставив остальную часть системы бодрствующей?


Представьте себе компьютер с двумя функциями:

  1. Файловый сервер и локальный веб-сервер требуется 24 часа в сутки.
  2. Графический сервер для медиацентра необходим только тогда, когда кто-то его использует.

Я рассматриваю возможность создания такой машины, поэтому позвольте мне вытащить некоторые диски из моего невероятно мощного рабочего стола и заменить наш медленный медиацентр Atom 2-го поколения.

Проблема с этой сборкой заключается в том, что XBMC является силовым зверем. Выйдя на свои собственные устройства, CPU никогда не войдет ни в что, даже близко к состоянию сна. Вещи улучшились, но единственный способ быть эффективным - положить его в S3 sleep. Очевидно, это закрывает все, что работает. В настоящее время мы просыпаемся через USB (ИК-приемник).

S3 Sleep не был бы возможен на новом компьютере, потому что я хотел бы, чтобы он выполнял серверные вещи, но я хотел бы оставить X-сервер (и все его клиенты) спать. Если это возможно. Это?

В противном случае я всегда могу отказаться от X, но это потеряло бы состояние XBMC, и я бы предпочел избежать этого. Если это единственный метод, можете ли вы предложить способ повторно инициализировать X из IR-команды? (И таким образом, чтобы это не противоречило обработке XBMC IR).

Заметка: Я полностью гибкий с графическим стеком. В настоящее время это всего лишь X и nodm загружая автономную версию XBMC, но если вам нужно что-то еще, все в порядке. Я также могу проверить это раньше, чем построить новую машину (на текущей).


4
2018-05-24 09:55


происхождения


kill -[STOP|CONT] <PID> похоже, что они могут быть полезны тогда и только тогда они могут работать на дереве процессов а также Я могу вызвать CONT сигнал от ИК. - Oli♦


ответы:


Приостановка дерева процессов

Я на полпути. я нашел kill -STOP <PID> который замораживает процесс. Есть CONT версия, которая пробуждает его. Поэтому я могу найти и STOP  nodm дерево процесса с этой сексуальной командой:

pstree -p $(ps ux | awk '/nodm$/ {print $2}') | grep -oP '\d+' | xargs kill -STOP

И мы можем разбудить все остановленные процессы (для текущего пользователя) с помощью:

ps ux | awk '$8 ~ /^T/ {print $2}' | xargs kill -CONT

На самом деле это работает. Я только что протестировал его, и я поражен тем, что ни X, XBMC, ни файл, который он играет над NFS (да, это работает в середине видео), похоже, что он приостановлен на пять минут.

Возобновление от IR

Это была следующая задача - как я мог перезапустить эти процессы из IR? Для этого нам нужно irexec который может запускать произвольную команду для любой кнопки, независимо от того, что еще слушает lirc.

Нам нужно несколько сценариев, чтобы это произошло. Первый ~/.lircrc

begin
prog = irexec
button = *
config = ~/.resume &
end

а также ~/.resume (это потребует chmod +x ~/.resume после его создания)

#!/bin/sh
ps ux | awk '$8 ~ /^T/ {print $2}' | xargs kill -CONT

Тогда все, что нам нужно сделать, это загрузить irexec, Чтобы он не был зомбирован при выполнении команды STOP, мы должны отключить процесс из текущего дерева, которое упрощается с помощью setsid, В моем случае я добавляю следующее перед установкой xbmc в ~/.xsession:

setsid irexec

Последняя загадка: Как я могу заставить XBMC запустить скрипт STOP вместо сна?

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


3
2018-05-24 10:30





Я не специалист по xbmc, но если он использует Lirc для поиска ИК-сообщений, вы можете добавить что-то вроде этого в файлы ~ / .licrc или / etc / lirc / lircrc, чтобы запустить ваши скрипты.

  begin wakeupwait
       button = OK (of course you may prefer to use another button for that purpose) 
       prog = irexec
       config = <your wake-up script path>
       quit
  end wakeupwait

  begin
       button = OK (same button) 
       prog = irexec
       config = <your pause script path>
       mode = wakeupwait
  end

некоторые документы:

irexec http://www.lirc.org/html/irexec.html

.lircrc http://www.lirc.org/html/configure.html (вариант режима стоит прочитать)

Эммануэль


1
2018-05-24 11:57



Да, нашел это отдельно. Кажется, что нужно выполнить эту работу, но она должна быть загружена вне X-цикла (в данном случае), или она также будет приостановлена. - Oli♦
один способ сделать это - использовать командную команду: команда echo | партия - Emmanuel