Questão É possível colocar X para dormir, deixando o resto do sistema acordado?


Imagine um computador com duas funções:

  1. Um servidor de arquivos e servidor local, necessário 24/7.
  2. Um servidor gráfico para um media center, requerido somente quando alguém o estiver usando.

Eu estou pensando em construir uma máquina desse tipo, então permita-me chutar alguns dos discos do meu desktop incrivelmente poderoso e substituindo nosso lento centro de mídia Atom de segunda geração.

O problema com essa compilação é que o XBMC é uma fera que consome energia. Deixada para seus próprios dispositivos, a CPU nunca entrará em algo nem perto de um estado de suspensão. As coisas melhoraram, mas a única maneira de ser eficiente é colocá-lo no sono S3. Obviamente, isso encerra qualquer coisa em execução. Atualmente, despertamos por USB (um receptor de infravermelho).

S3 Sleep não seria possível na nova máquina, porque eu gostaria que ele executasse as coisas do servidor, mas eu gostaria de colocar o servidor X (e todos os seus clientes) para dormir. Se isso for possível. É isso?

Se isso falhar, posso sempre sair do X, mas isso perderia o estado do XBMC e eu preferiria evitar isso. Se esse é o único método, você pode sugerir uma maneira de reinicializar o X de um comando IR? (E de uma forma que não colida com o tratamento de IR do XBMC).

Nota: Eu sou completamente flexível com a pilha gráfica. Atualmente, é apenas X e nodm carregando uma versão autônoma do XBMC, mas se o que você precisa requer outra coisa, tudo bem. Eu também posso testar isso antes de construir uma nova máquina (na atual).


4
2018-05-24 09:55


origem


kill -[STOP|CONT] <PID> parece que eles podem ser úteis sse eles podem trabalhar em uma árvore de processos e Posso acionar o CONT sinal do IR. - Oli♦


Respostas:


Pausando uma árvore de processo

Eu estou no meio do caminho. eu encontrei kill -STOP <PID> que congela um processo. Há um CONT versão também que acorda. Portanto, eu posso encontrar e STOP a nodm árvore de processos com este comando sexy:

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

E podemos acordar todos os processos interrompidos (para o usuário atual) com:

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

Isso realmente parece funcionar. Eu acabei de testá-lo e estou surpreso que nem o X, XBMC ou o arquivo que está sendo reproduzido no NFS (sim, isso funciona no meio do vídeo) parece se importar que ele esteja sendo pausado por cinco minutos.

Resumindo do IR

Este foi o próximo desafio - como eu poderia reiniciar esses processos a partir do IR? Para isso precisamos irexec que pode executar um comando arbitrário para qualquer botão, independentemente do que mais estiver escutando lirc.

Precisamos de alguns scripts para que isso aconteça. Primeiro ~/.lircrc

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

e ~/.resume (isso vai precisar chmod +x ~/.resume correndo depois que ele é criado)

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

Então tudo o que precisamos fazer é carregar irexec. Para evitar que ele seja zumbificado quando o comando STOP é executado, temos que desviar o processo para fora da árvore atual, que é simplificada com setsid. No meu caso, adiciono o seguinte antes do launcher do xbmc ~/.xsession:

setsid irexec

O mistério final: Como posso obter o XBMC para executar o script STOP em vez de dormir?

A única parte que não resolvi agora é fazer com que o XBMC execute um comando em vez de desligar. Trabalho em progresso. A única opção que posso encontrar no momento é criar um protetor de tela Python personalizado para o XBMC que parece realmentemaçante (e não consigo trabalhar).


3
2018-05-24 10:30





Eu não sou especialista em xbmc, mas se ele usa o Lirc para capturar mensagens de infravermelho, você pode adicionar algo assim aos arquivos ~ / .licrc ou / etc / lirc / lircrc para acionar seus scripts.

  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

alguns documentos:

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

.lircrc http://www.lirc.org/html/configure.html (opção de modo vale a pena ler)

Emmanuel


1
2018-05-24 11:57



Sim, encontrei isso separadamente. Parece fazer o trabalho, mas tem que ser carregado fora do loop X (neste caso) ou será suspenso também. - Oli♦
Uma maneira de fazer isso é usar o comando batch: echo command | lote - Emmanuel