这是 RPi 的交叉帖子。我编写了一系列 bash 函数来允许我在 Raspbian、kodi 和 emulationstation 之间切换,以便我可以使用 Siri/homebridge 来启动切换。切换效果非常好。唯一的问题是,停止任何操作系统而不启动另一个操作系统会使控制台与 VT1 的连接处于某种奇怪的状态。我所看到的只是黑屏。
我可以使用 alt+F1 或执行sudo chvt 2;sudo chvt 1
重新初始化 VT1 来手动修复此问题,但我更愿意完全避免这种不良状态。我认为这是使用 pkill 停止操作系统的副作用。例如pkill emulationstatio;pkill xinit;pkill kodi;
。
我可以添加sudo chvt 2;sudo chvt 1
到我的停止功能,但我不想这样做,因为我不知道该功能中另一个操作系统是否正在启动或将要启动。
那么我怎样才能干净地停止 kodi/emulationstation/raspbian 以便 VT 1 保持良好状态,以便我可以在操作系统停止后看到控制台?
顺便说一句,这是在树莓派上。我一直在通过 ssh 进行测试,并在沙发上通过 HDMI 连接的电视观看结果。
答案1
kodi 的子进程仍然可以控制 vt 1。只是将pkill kodi
孩子变成孤儿,但不会杀死它。屏幕变黑是因为 kodi 实际上已经半死不活了。杀死 kodi 及其所有子进程将使您返回控制台。
要获取 kodi 及其子项的所有 pid,您可以执行类似的操作(在 bash 中)。首先,创建一个函数来获取给定 PID 的所有子 PID:
getfamilypids() {
local inpid="$1"
local pidarray=()
function getfamilypidshelper() {
local pidin="$1"
pidarray+=($pidin)
local CPIDS="$(pgrep -P $pidin)"
for cpid in $CPIDS; do
getfamilypidshelper $cpid
done
}
getfamilypidshelper "$inpid"
#reverse the array
local rpidarray=()
for ((z=${#pidarray[*]}-1; z>-1; z--)); do
rpidarray+=(${pidarray[z]})
done
echo ${rpidarray[*]}
}
要获取您启动的 kodi 进程的 PID,您可以这样做:
pgrep -f kodi
然后就可以得到你返回的PID的子进程了:
getfamilypids __PID_FROM_ABOVE__
请注意,PID 的顺序getfamilypids
是相反的。您应该kill
从左到右按顺序排列它们。我编写了一种方法来自动杀死所有它们,并等待它们干净地完成,然后再杀死下一个,但这是另一个问题的主题。