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).