Получить идентификатор X Window из процесса в Bash
Есть ли какой-нибудь инструмент / инструмент bash, который мог бы сказать, какие окна были созданы определенным процессом?
3 ответа
wmctrl -lp
дает мне окна и их PID. Образец вывода:
0x04c00022 0 2168 ciro ciro.santilli - Skype™
0x03c00014 0 2154 ciro Krusader
0x03200022 0 2181 ciro Guake!
...
Как уже упоминалось, вы можете использовать инструменты командной строки, такие как wmctrl
или же xprop
, Клиенты должны вести себя хорошо _NET_WM_PID
свойство pid процесса, который создал главное окно (все популярные наборы инструментов делают это за вас). Обратите внимание, что некоторые клиенты не устанавливают его или могут быть на другом физическом компьютере (вы можете использовать WM_CLIENT_MACHINE
свойство) - поэтому используйте эту информацию в качестве подсказки и не полагайтесь на то, чтобы она присутствовала или была точной. Смотрите спецификацию emwh на freedesktop для справки.
Вот несколько решений для управления окнами X11 (в том числе одно к этой проблеме).
Чтобы получить идентификатор окна по его идентификатору процесса, используйте wmctrl следующим образом:
#!/usr/bin/env bash
# getwindidbypid
#
# Get the ID of a window by PID (if the process has a window).
#
# Usage:
# getwindidbypid <PID>
#
while IFS= read line; do
if [[ "${line}" =~ (0x)([0-9a-z]+)([ ][- ][0-9]+[ ])([0-9]*) ]]; then
winId="${BASH_REMATCH[1]}${BASH_REMATCH[2]}"
pid="${BASH_REMATCH[4]}"
if [[ "${pid}" -eq "${1}" ]]; then
WIND_IDS+=("${winId}")
fi
fi
done < <(wmctrl -lp)
if [ "${#WIND_IDS[@]}" -gt 0 ]; then
echo "${WIND_IDS[0]}"
fi
Пример:
user ~ $ getwindidbypid 37248
0x05a00012