これはRPiのクロスポストです。私はRaspbian、kodi、およびエミュレーションステーションを切り替えてSiri / homebridgeを使用して切り替えを開始できるようにする一連のbash機能を作成しました。スイッチング効果が非常に良いです。唯一の問題は、他のオペレーティングシステムを起動せずにオペレーティングシステムを停止すると、コンソールとVT1の接続が奇妙なままになるということです。私が見るのは黒い画面だけです。
Alt+F1 を使用するか VT1 を再初期化することでsudo chvt 2;sudo chvt 1
この問題を手動で解決できますが、この望ましくない状態を完全に回避することをお勧めします。私はこれがオペレーティングシステムを停止するためにpkillを使用するときの副作用だと思います。たとえばpkill emulationstatio;pkill xinit;pkill kodi;
。
停止機能を追加できますが、sudo chvt 2;sudo chvt 1
他のOSが起動しているのか、その機能で起動するのかわからないため、そうしたくありません。
それでは、OSが停止した後にコンソールを表示できるように、VT 1が良好な状態を維持するようにkodi / emulationstation / raspbianを完全に停止するにはどうすればよいですか?
ところで、これはラズベリーパイにあります。私は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
左から右に順番に配置する必要があります。自動的にすべてを殺し、きれいに終わるのを待ってから、次の殺す方法を書きましたが、それは別の質問のトピックです。