É possível colocar X em suspensão, deixando o resto do sistema acordado?

4

Imagine um computador com duas funções:

  1. Um servidor de arquivos e um servidor da Web local, necessário 24 horas por dia, sete dias por semana.
  2. Um servidor gráfico para um media center, necessário apenas quando alguém o está usando.

Estou pensando em construir uma máquina desse tipo, então permita-me chutar alguns 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 se alimenta de 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 o servidor funcionasse, mas gostaria de colocar o servidor X (e todos os seus clientes) em suspensão. Se isso for possível. É?

Na falta disso, eu sempre consigo sair do X, mas isso iria perder 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: sou completamente flexível com a pilha gráfica. Atualmente, é apenas X e nodm carregando uma versão independente 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).

    
por Oli 24.05.2013 / 11:55

2 respostas

3

Pausando uma árvore de processos

Estou no meio do caminho. Eu encontrei kill -STOP <PID> que congela um processo. Também há uma versão CONT que a ativa. Portanto, eu posso encontrar e STOP a árvore processual nodm com este comando sexy:

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

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

ps ux | awk ' ~ /^T/ {print }' | 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 que está sendo pausado por cinco minutos.

Retomando do IR

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

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

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

e ~/.resume (isso precisará de chmod +x ~/.resume em execução após ser criado)

#!/bin/sh
ps ux | awk ' ~ /^T/ {print }' | 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 da árvore atual, que é simplificada com setsid . No meu caso, adiciono o seguinte antes do launcher do xbmc em ~/.xsession :

setsid irexec

O mistério final: Como posso fazer com que o XBMC execute 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 realmente aborrecido (e não consigo trabalhar).

    
por Oli 24.05.2013 / 12:30
1

Não sou especialista em xbmc, mas se usar 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 link

.lircrc link (opção de modo vale a pena ler)

Emmanuel

    
por Emmanuel 24.05.2013 / 13:57