Chvt

如何重置 VT 1(或避免進入不良狀態)?

  • May 18, 2019

這是來自 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 的電視觀看結果。

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從左到右按順序排列它們。我寫了一個方法來自動殺死所有它們並等待它們乾淨地完成,然後再殺死下一個,但這是另一個問題的主題。

引用自:https://unix.stackexchange.com/questions/517362