我目前有一个单用户系统,它自动加载到 X 并通过运行的超级简单的 Upstart 作业启动 XBMC:
su -c "startx /etc/X11/Xsession /usr/bin/xbmc-standalone -- -bs" oli
超级简单而且好用,坚如磐石……没有桌面干扰。没有窗口管理器来降低性能。当 XBMC 崩溃时(每天一次),它会恢复。如果您只想使用 XBMC,那就太好了。但现在我想安装 Steam 来玩游戏。这引发了一些问题:
Steam 和 XBMC 将会争夺屏幕使用时间(记住,没有窗口管理器)和音频设备。我们需要在启动 Steam 之前关闭 XBMC,但无需杀死X。请注意 XBMC 当前是如何启动的。我该怎么做?
如果我能从我的无线 XBox 控制器触发 XBMC→Steam 切换,那就太棒了。它与
xboxdrv
其中有一个exec
选项:xboxdrv --ui-buttonmap XBOXBTN=exec:/home/oli/bin/switch.sh
因此假设 #1 可以编写脚本,我就可以加入。
#1 的后半部分。当 Steam 消失时,我需要 XBMC 重新启动。
如果当前正在运行崩溃,它需要是重新加载的东西。
所以看来我最大的问题是监控应用程序。如果它正常退出(代码 0,例如我要求它退出,或者我调用了要求它退出的脚本),它应该加载另一个应用程序并监控它。如果它崩溃了(不是代码为零),它应该运行相同的应用程序并监控它。有道理吗?但是如何?
这一切感觉就像 Upstart 会很适合,只不过两者都是在用户级别运行的 X 应用程序。我使用的是 14.04,所以如果它已经足够先进,这可能是一个选择。
可能还有一种 XBMC 和/或 Steam 独有的方法。我愿意听取建议。
答案1
这只是我的想法。以下是应该在以下两种情况之间交替使用的脚本阻塞命令
#!/bin/bash
XBMC="xbmc-standalone"
STEAM="steam steam://open/bigpicture"
current=$XBMC
openbox-session # urgh required by Steam for keyboard IO
while true; do
$current # blocks until exit code
[[ "$?" -ne "0" ]] && continue
if [[ $current == $XBMC ]]; then
current=$STEAM
else
current=$XBMC
fi
done
如果我可以xbmc-standalone
在 X 启动时调用它,那么脚本就可以无限期地保持活动状态(这将使 X 保持活动状态)。