Примечание: Это было протестировано на ноутбуке с i915 управляемая видеокарта.
Примечание: Когда новый экран включается, никакое событие не отправляется в хост, это осталось верным даже после моего последнего редактирования. Таким образом, единственный путь состоит в том, чтобы использовать опрос. Попытка сделать их максимально эффективными...
Наконец существует одно лучшее решение (через ACPI):
Нет все еще никакого события, но ACPI кажется более эффективным, чем xrandr
запросить. (Nota: Это требует загруженных модулей ядра ACPI, но не требует полномочий пользователя root).
Мое конечное решение (использующий удар):
isVgaConnected() {
local crtState
read -a < /proc/acpi/video/VID/CRT0/state crtState
test $(( ( ${crtState[1]} >>4 ) ${1:+*-1+1} )) -ne 0
}
Теперь тест:
$ if isVgaConnected; then echo yes; else echo no; fi
yes
Это включается, поэтому теперь я отключаю его:
$ if isVgaConnected; then echo yes; else echo no; fi
no
Примечание: ${1:+*-1+1}
разрешите булев аргумент: Если бы что-то присутствует, ответ был бы инвертирован: ( crtState >> 4 ) * -1 + 1
.
и заключительный сценарий:
#!/bin/bash
export crtProcEntry=/proc/acpi/video/VID/CRT0/state
isVgaConnected() {
local crtState
read -a < $crtProcEntry crtState
test $(( ( ${crtState[1]} >>4 ) ${1:+*-1+1} )) -ne 0
}
delay=.1
unset switch
isVgaConnected || switch=not
while :;do
while isVgaConnected $switch;do
sleep $delay
done
if [ "$switch" ];then
unset switch
echo VGA IS connected
# doing something while VGA is connected
else
switch=not
echo VGA is NOT connected.
# doing something else, maybe.
fi
done
ПРЕДУПРЕЖДЕНИЯ: легче, чем xrandr
, но весьма важный с задержкой, меньшей, чем 0,02 секунды, сценарий Bash перейдет к вершине процесса едоков ресурса (top
)!
В то время как это стоит ~0.001 секунд:
$ time read -a
Это требует ~0.030 секунд:
$ read -a < /proc/acpi/video/VID/CRT0/state crtState
Это является большим! Таким образом в зависимости от того, в чем Вы нуждаетесь, delay
мог быть обоснованно установлен между 0.5
и 2
.
Я наконец нашел что-то, с помощью этого:
Важная правовая оговорка: Проигрывание с /proc
и /sys
записи могли повредить Вашу систему!!! Не пробуйте следующий производственные системы.
mapfile watchFileList < <(
find /sys /proc -type f 2>/dev/null |
grep -i acpi\\\|i91
)
prompt=("/" "|" '\' '-');
l=0
while :; do
mapfile watchStat < <(
grep -H . ${watchFileList[@]} 2>/dev/null
)
for ((i=0;i<=${#watchStat[@]};i++)); do
[ "${watchStat[i]}" == "${oldStat[i]}" ] || echo ${watchStat[i]}
done
oldStat=("${watchStat[@]}")
sleep .5
printf "\r%s\r" ${prompt[l++]}
[ $l -eq 4 ]&&l=0
done
... после некоторой очистки нежелательных записей:
for ((i=0;i<=${#watchFileList[@]};i++)); do
[[ "${watchFileList[$i]}" =~ /sys/firmware/acpi/interrupts/sci ]] &&
unset watchFileList[$i] && echo $i
done
Я смог считать это:
/proc/acpi/video/VID/CRT0/state:state: 0x1d
/proc/acpi/video/VID/CRT0/state:state: 0x0d
/proc/acpi/video/VID/CRT0/state:state: 0x1d
Когда я включаю, отключаю, и переразъем в кабеле монитора.
Исходный ответ
Когда конфигурация запрашивается (выполнение system/preferences/monitor
или xrandr
), видеокарты делают тип сканирования, таким образом работая xrandr -q
дайте Вам информацию, но необходимо запросить состояние.
Я просканировал все журналы, (ядро, демон, X и т.д) поиск /proc
& /sys
, и ясно ничто, кажется, не существует, который удовлетворяет Ваш запрос.
Я попробовал это также:
export spc50="$(printf "%50s" "")"
watch -n1 '
find /proc/acpi/video -type f |
xargs grep -H . |
sed "s/^\([^:]*):/\1'$spc50'}:/;
s/^\(.\{50\}\) *:/\1 /"'
В конце концов, это, если Вы работаете System/Preferences/Monitor
в то время как никакой новый экран не был просто включен, ни отключен, инструмент будет появляться просто (обычно). Но если Вы включили или отключили экран прежде, время от времени Вы будете выполнять этот инструмент, и Вы будете видеть, что Ваш рабочий стол делает тип сброса или обновления (то же, если Вы будете работать xrandr
).
Это, кажется, подтверждает, что этот инструмент просит xrandr
(или работы таким же образом), запрашивая состояние периодически, начиная в то время, когда это выполняется.
Вы могли судить себя:
$ for ((i=10;i--;)); do xrandr -q | grep ' connected' | wc -l; sleep 1; done
1
1
1
2
2
2
1
1
1
1
Это отобразится, сколько экранов (дисплеи) соединено, в течение 10 секунд.
В то время как это работает, включите и/или отключите свой экран/монитор и посмотрите, что, происходит. Таким образом, Вы могли создать немного тестовой функции Bash:
isVgaConnected() {
local xRandr=$(xrandr -q)
[ "$xRandr" == "${xRandr#*VGA1 con}" ] || return 0
return 1
}
который был бы применим как в:
$ if isVgaConnected; then echo yes; fi
Но будьте осторожны, xrandr
занимает приблизительно 0,140 секунды к 0.200 секундам, в то время как никакого изменения не происходит на разъемах и до 0.700 секунд каждый раз, когда что-то было включено или отключено незадолго до (ПРИМЕЧАНИЕ: Это, кажется, не едок ресурса).
Для обеспечения я не преподаю что-то неправильное, я искал вокруг сети и документов, но ничего не нашел о DBus и Экранах.
Наконец, я работал в двух различных окнах dbus-monitor --system
(Я играл с опциями также), и небольшой сценарий, который я записал:
$ for ((i=1000;i--;)); do isVgaConnected && echo yes || echo no; sleep .5; done
... и снова включенный, чем отключенный монитор, много раз. Таким образом, теперь я мог сказать:
xrandr -q
знать, включается ли монитор или нет.Но соблюдите осторожность, потому что, кажется, нет других путей. Например, xrandr
кажется, совместно использует эту информацию, таким образом, мой рабочий стол GNOME переключился бы на xinerama
автоматически... когда я работал xrandr
.
Если ssh
на стороне прокси является достаточно новым (> = OpenSSH 5.4), можно использовать -W
опция, которая работает подобная, чем nc
. Добавьте к соответствующей записи в Вашем .ssh/config
файл:
ProxyCommand ssh -W %h:%p PROXYHOST
Пример:
Host TARGETHOST
ProxyCommand ssh -W %h:%p PROXYHOST
HostName 10.0.0.1
PROXYHOST
берет другого пользователя, чемTARGETHOST
, можно указать его в концеProxyCommand
с-l <proxyuser>
. И дляTARGETHOST
Вы указываете его на другой строке сUser <targetuser>
– Ciprian Tomoiagă 20.12.2016, 13:09