:0.0
예를 들어 두 개의 서로 다른 X 모니터에서 실행 되고 각각 과 에서 실행되는 창 관리자 Blackbox가 있다고 가정해 보겠습니다 :1.0
. 터미널(에뮬레이터)에서 현재 X 디스플레이를 사용하여 블랙박스 프로세스를 어떻게 종료(종료)합니까? 이 명령은 두 세션을 모두 종료하므로 적합하지 않습니다.tty1
tty2
killall blackbox
답변1
ps e
프로세스와 해당 명령줄 및 (초기?) 환경 변수를 나열합니다. -display :0
명령줄이나 환경과 일치하는 프로세스를 필터링합니다 DISPLAY=:0
. 나는 이것이 수동으로 시작하든 일부 세션 스크립트를 통해 시작하든 문제가 되는 wm을 찾을 것이라고 믿습니다. 그러면 kill
간단하게 할 수 있습니다.
나는 다른 ps 구현이 있고 위의 (bsd?) 명령줄 스타일이 debian procps-ng를 사용하는 내 컴퓨터에서 작동한다고 들었습니다. 필요한 경우 설명서를 참조하세요.
wm이 소유자라는 관찰을 바탕으로루트 창,이 Vault 위키 페이지에는 하위 섹션이 있습니다.pid를 찾는 데 사용되는 방법입니다 xprop -root _NET_WM_PID
. 그러나 이것은 나에게는 작동하지 않습니다. x 창은 이 속성을 자발적으로만 제공하고 내 wm은 이러한 방식을 따르지 않기 때문인 것 같습니다.
작동하지 않는 다른 아이디어의 경우 xkill이 클라이언트를 분리할 수 있습니다.와는 별개로루트 창이므로 이는 우리의 요구 사항을 충족하지 않습니다.
답변2
블랙박스를 시작한 tty를 식별한 경우 ps -t tty1
해당 터미널에서 시작된 프로세스가 나열되며(tty1이 종료하려는 openbox를 시작한 프로세스라고 가정) 원하는 프로세스를 식별하고 종료할 수 있습니다.
답변3
soubunmei의 답변에서 영감을 얻은 솔루션은 다음과 같습니다.
#!/bin/sh
ActiveWindowManagerPID()
{
local windowManager="$1"
local windowManagerPIDs="$(pidof "$windowManager")"
local displayNumber="$(echo $DISPLAY \
| awk 'BEGIN { FS = "[:.]" } { print $2 }')"
ps e -p "$windowManagerPIDs" \
| awk -v n="$displayNumber" \
'$0 ~ " DISPLAY=:" n "[\n .]" { print $1 }'
}
kill "$(ActiveWindowManagerPID blackbox)"