Frage Ist es möglich, X einzuschalten und den Rest des Systems wach zu lassen?


Stellen Sie sich einen Computer mit zwei Funktionen vor:

  1. Ein Fileserver und lokaler Webserver, 24/7 erforderlich.
  2. Ein grafischer Server für ein Media Center, der nur benötigt wird, wenn jemand ihn verwendet.

Ich überlege mir, eine solche Maschine zu bauen, also erlaube mir, einige der Festplatten aus meinem unglaublich leistungshungrigen Desktop herauszutreten und unser langsames Atom-Media-Center der zweiten Generation zu ersetzen.

Das Problem mit diesem Build ist XBMC ist ein Power-Essen Biest. Wenn die CPU auf sich selbst gestellt ist, wird die CPU niemals etwas in die Nähe eines Schlafzustands bringen. Die Dinge haben sich verbessert, aber der einzige Weg, um effizient zu sein, ist, es in S3-Schlaf zu versetzen. Offensichtlich schaltet das alles ab. Wir wachen derzeit über USB (ein IR-Empfänger).

S3 Sleep wäre auf der neuen Maschine nicht möglich, weil ich möchte, dass Server-Dinge laufen, aber ich möchte den X-Server (und alle seine Clients) in den Ruhezustand versetzen. Wenn das möglich ist. Ist es?

Wenn ich das nicht kann, kann ich immer X beenden, aber das würde den Zustand von XBMC verlieren und das würde ich lieber vermeiden. Wenn dies die einzige Methode ist, können Sie einen Weg vorschlagen, X von einem IR-Befehl zu reinitialisieren? (Und in einer Weise, die nicht mit XBMC Umgang mit IR kollidiert).

Hinweis: Ich bin völlig flexibel mit dem grafischen Stapel. Es ist derzeit nur X und nodm eine eigenständige Version von XBMC laden, aber wenn das, was Sie brauchen, etwas anderes erfordert, ist das in Ordnung. Ich kann das auch vor dem Bau einer neuen Maschine (auf der aktuellen) testen.


4
2018-05-24 09:55


Ursprung


kill -[STOP|CONT] <PID> sehen aus, als könnten sie hilfreich sein wenn Sie können an einem Prozessbaum arbeiten und Ich kann das auslösen CONT Signal von IR. - Oli♦


Antworten:


Einen Prozessbaum pausieren

Ich bin auf halbem Weg. ich fand kill -STOP <PID> was einen Prozess einfriert. Da ist ein CONT Version auch, die es aufwacht. Deshalb kann ich und finden STOP das nodm Prozessbaum mit diesem sexy Befehl:

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

Und wir können alle gestoppten Prozesse (für den aktuellen Benutzer) mit folgenden Aktionen aufwecken:

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

Das scheint tatsächlich zu funktionieren. Ich habe es gerade getestet und ich bin erstaunt, dass weder X, XBMC oder die Datei, die es über NFS spielt (ja, das funktioniert mitten im Video), daran zu denken scheinen, dass es für fünf Minuten pausiert wird.

Fortsetzen von IR

Das war die nächste Herausforderung - wie konnte ich diese Prozesse von IR aus starten? Dafür brauchen wir irexec Das kann einen beliebigen Befehl für jede Schaltfläche ausführen, unabhängig davon, was sonst noch lirc gehört.

Wir brauchen ein paar Skripte, um dies zu ermöglichen. Zuerst ~/.lircrc

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

und ~/.resume (Das wird brauchen chmod +x ~/.resume läuft, nachdem es erstellt wurde)

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

Dann müssen wir nur noch laden irexec. Um zu verhindern, dass es beim Ausführen des STOP-Befehls zombiert wird, müssen wir den Prozess aus dem aktuellen Baum umleiten, was mit einfach gemacht wird setsid. In meinem Fall füge ich Folgendes vor dem Launcher von xbmc hinzu ~/.xsession:

setsid irexec

Das letzte Rätsel: Wie kann ich XBMC dazu bringen, das STOP-Skript auszuführen anstatt zu schlafen?

Der einzige Teil, den ich jetzt nicht gelöst habe, ist, XBMC dazu zu bringen, einen Befehl auszuführen, anstatt herunterzufahren. In Arbeit. Die einzige Option, die ich im Moment finden kann, ist die Erstellung eines benutzerdefinierten Python-Bildschirmschoners für XBMC Ja wirklichlangweilig (und ich kann es nicht funktionieren).


3
2018-05-24 10:30





Ich bin kein xbmc-Spezialist, aber wenn Lirc verwendet wird, um IR-Nachrichten zu erfassen, könnten Sie etwas zu den ~ / .licrc- oder / etc / lirc / lircrc-Dateien hinzufügen, um Ihre Skripte auszulösen.

  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

einige Dokumente:

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

.lircrc http://www.lirc.org/html/configure.html (Modus-Option ist es wert zu lesen)

Emmanuel


1
2018-05-24 11:57



Yup, fand das separat. Scheint, den Job zu tun, aber es muss außerhalb der X-Schleife (in diesem Fall) geladen werden, oder es wird auch ausgesetzt. - Oli♦
Eine Möglichkeit ist das Verwenden des Stapelbefehls: echo command | Stapel - Emmanuel