VT 1をリセットするにはどうすればよいですか(悪い状態にならないようにするには)。

VT 1をリセットするにはどうすればよいですか(悪い状態にならないようにするには)。

これは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左から右に順番に配置する必要があります。自動的にすべてを殺し、きれいに終わるのを待ってから、次の殺す方法を書きましたが、それは別の質問のトピックです。

関連情報