Представьте себе компьютер с двумя функциями:
Я подумываю о создании такой машины, поэтому позвольте мне выкинуть несколько дисков из моего невероятно энергоемкого рабочего стола и заменить наш медленный медиацентр 2-го поколения Atom.
Проблема с этой сборкой в том, что XBMC - зверь, питающийся энергией. Оставленный на своих собственных устройствах, процессор никогда не войдет в состояние, близкое к спящему. Вещи улучшились, но единственный способ быть эффективным - это положить его в сон S3. Очевидно, что это закрывает все, что работает. В настоящее время мы просыпаемся через USB (ИК-приемник).
S3 Спать невозможно на новой машине, потому что я хотел бы, чтобы она работала на сервере, но я хотел бы перевести X-сервер (и все его клиенты) в спящий режим. Если это возможно. Так ли это?
Если это не удастся, я всегда могу выйти из X, но это приведет к потере состояния XBMC, и я бы предпочел этого избежать. Если это единственный метод, можете ли вы предложить способ повторной инициализации X из ИК-команды? (И в пути, который не противоречит обработке IR в XBMC).
Примечание: Я полностью гибок с графическим стеком. В настоящее время X и nodm
загружают автономную версию XBMC, но если вам нужно что-то еще, это нормально. Я также могу проверить это перед созданием новой машины (на текущей).
Я на полпути. Я нашел 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
[ 1122] Кажется, это действительно работает. Я только что проверил это, и я поражен тем, что ни X, ни XBMC, ни файл, который он воспроизводит по NFS (да, это работает в середине видео), похоже, не возражают, что его приостановили на пять минут.
Это была следующая проблема - как я мог перезапустить эти процессы из 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 выполнить команду вместо выключения. Работа в процессе. Единственный вариант, который я могу найти на данный момент, - это создание специальной заставки Python для XBMC, которая кажется действительно скучной (и я не могу заставить ее работать).
Я не специалист по xbmc, но если он использует Lirc для перехвата IR-сообщений, вы можете добавить что-то подобное в файлы ~ / .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 (параметр mode стоит прочитать)
Emmanuel