是否可以让 X 进入睡眠状态,而系统其余部分保持唤醒?

是否可以让 X 进入睡眠状态,而系统其余部分保持唤醒?

想象一台具有两种功能的计算机:

  1. 需要 24/7 运行的文件服务器和本地网络服务器。
  2. 媒体中心的图形服务器,仅在有人使用时才需要。

我正在考虑构建这样一台机器,所以请允许我从耗电极大的台式机中取出一些磁盘,并替换我们缓慢的第二代 Atom 媒体中心。

此版本的问题在于 XBMC 非常耗电。如果任其发展,CPU 永远不会进入任何接近睡眠状态的状态。情况已经有所改善,但提高效率的唯一方法是将其置于 S3 睡眠状态。显然,这会关闭所有正在运行的设备。我们目前通过 USB(红外接收器)唤醒。

在新机器上无法使用 S3 睡眠,因为我希望它运行服务器程序,但我想让 X 服务器(及其所有客户端)进入睡眠状态。如果可以的话。是吗?

如果失败,我始终可以退出 X,但那样会丢失 XBMC 的状态,我宁愿避免这种情况。如果这是唯一的方法,您能否建议一种通过 IR 命令重新初始化 X 的方法?(并且以不与 XBMC 对 IR 的处理冲突的方式)。

笔记:我对图形堆栈非常灵活。目前只有 X 并nodm加载独立版本的 XBMC,但如果您需要其他东西,那也没问题。我还可以在构建新机器之前(在当前机器上)测试它。

答案1

暂停进程树

我已经完成了一半。我找到了kill -STOP <PID>冻结进程的方法。还有一个CONT版本可以唤醒进程。因此,我可以使用这个命令找到进程树STOPnodm

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

我们可以使用以下命令唤醒所有已停止的进程(对于当前用户):

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

这似乎确实有效。我刚刚测试过,令我惊讶的是,X、XBMC 或它通过 NFS 播放的文件(是的,这在视频播放过程中有效)似乎都不介意它暂停五分钟。

从 IR 恢复

这是下一个挑战——我如何从 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 运行 STOP 脚本而不是休眠?

我现在唯一没有解决的部分是让 XBMC 运行命令而不是关闭。工作正在进行中。目前我能找到的唯一选项是为 XBMC 创建自定义 Python 屏幕保护程序,这似乎真的很无趣(而且我无法让它工作)。

答案2

我不是 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

一些文件:

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

.lircrchttp://www.lirc.org/html/configure.html (模式选项值得一读)

伊曼纽尔

相关内容