이것은 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을 완전히 중지하려면 어떻게 해야 합니까?
그런데, 이것은 Raspberry Pi에 있습니다. 저는 SSH를 통해 테스트하고 HDMI로 연결된 TV를 통해 소파에 앉아 결과를 지켜보았습니다.
답변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
왼쪽에서 오른쪽으로 순서대로 배열 해야 합니다 . 자동으로 다 죽이고 깨끗하게 끝날 때까지 기다렸다가 다음 죽이는 방법을 썼는데 그건 또 다른 질문의 주제입니다.