想象一台具有两种功能的计算机:
- 需要 24/7 运行的文件服务器和本地网络服务器。
- 媒体中心的图形服务器,仅在有人使用时才需要。
我正在考虑构建这样一台机器,所以请允许我从耗电极大的台式机中取出一些磁盘,并替换我们缓慢的第二代 Atom 媒体中心。
此版本的问题在于 XBMC 非常耗电。如果任其发展,CPU 永远不会进入任何接近睡眠状态的状态。情况已经有所改善,但提高效率的唯一方法是将其置于 S3 睡眠状态。显然,这会关闭所有正在运行的设备。我们目前通过 USB(红外接收器)唤醒。
在新机器上无法使用 S3 睡眠,因为我希望它运行服务器程序,但我想让 X 服务器(及其所有客户端)进入睡眠状态。如果可以的话。是吗?
如果失败,我始终可以退出 X,但那样会丢失 XBMC 的状态,我宁愿避免这种情况。如果这是唯一的方法,您能否建议一种通过 IR 命令重新初始化 X 的方法?(并且以不与 XBMC 对 IR 的处理冲突的方式)。
笔记:我对图形堆栈非常灵活。目前只有 X 并nodm
加载独立版本的 XBMC,但如果您需要其他东西,那也没问题。我还可以在构建新机器之前(在当前机器上)测试它。
答案1
暂停进程树
我已经完成了一半。我找到了kill -STOP <PID>
冻结进程的方法。还有一个CONT
版本可以唤醒进程。因此,我可以使用这个命令找到进程树STOP
:nodm
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 (模式选项值得一读)
伊曼纽尔