Eu gostaria de saber, na linha de comando, se um monitor está conectado a um computador (para que eu possa decidir, a partir de um script, se o X deve estar em execução ou não). Como eu posso fazer isso?
Não posso depender da presença de X, então isso exclui qualquer coisa que dependa de uma exibição válida de X, como xrandr
. encontreiddccontrol
, mas sua saída é multilinha e não é trivial de analisar. (Isso me diz que a informação está teoricamente disponível da maneira que eu quero). Existe um programa mais compatível com scripts que possa me dizer se um monitor está conectado ao sistema?
A maioria dos sistemas nos quais eu gostaria de executar isso está executando o Fedora 20.
Responder1
Eu não tentei isso no fedora 20 (apenas no Ubuntu 13.04), mas a teoria na minha cabeça é sólida.
Você poderia tentar usar read-edid (http://www.polypux.org/projects/read-edid/)
O que deve fornecer um modelo compatível com XF86. Que você pode analisar.
Para quepodertrabalhar. Talvez seja ainda mais fácil e você possa apenas verificar o código de saída.
$ sudo get-edid > edid
get-edid: get-edid version 2.0.0
Performing real mode VBE call
Interrupt 0x10 ax=0x4f00 bx=0x0 cx=0x0
Function supported
Call successful
VBE version 300
VBE string at 0x11100 "NVIDIA"
VBE/DDC service about to be called
Report DDC capabilities
Performing real mode VBE call
Interrupt 0x10 ax=0x4f15 bx=0x0 cx=0x0
Function supported
Call successful
Monitor and video card combination does not support DDC1 transfers
Monitor and video card combination supports DDC2 transfers
0 seconds per 128 byte EDID block transfer
Screen is not blanked during DDC transfer
Reading next EDID block
VBE/DDC service about to be called
Read EDID
Performing real mode VBE call
Interrupt 0x10 ax=0x4f15 bx=0x1 cx=0x0
Function supported
Call failed
The EDID data should not be trusted as the VBE call failed
EDID claims 255 more blocks left
EDID blocks left is wrong.
Your EDID is probably invalid.
tom@tom:~$ parse-edid < edid
parse-edid: parse-edid version 2.0.0
parse-edid: EDID checksum failed - data is corrupt. Continuing anyway.
parse-edid: first bytes don't match EDID version 1 header
parse-edid: do not trust output (if any).
# EDID version 255 revision 255
Section "Monitor"
Identifier "___:ffff"
VendorName "___"
ModelName "___:ffff"
# DPMS capabilities: Active off:yes Suspend:yes Standby:yes
Mode "4095x4095" # vfreq 9.770Hz, hfreq 80.018kHz
DotClock 655.350000
HTimings 4095 4350 4605 8190
VTimings 4095 4158 4221 8190
Flags "Interlace" "+HSync" "+VSync"
EndMode
Mode "4095x4095" # vfreq 9.770Hz, hfreq 80.018kHz
DotClock 655.350000
HTimings 4095 4350 4605 8190
VTimings 4095 4158 4221 8190
Flags "Interlace" "+HSync" "+VSync"
EndMode
Mode "4095x4095" # vfreq 9.770Hz, hfreq 80.018kHz
DotClock 655.350000
HTimings 4095 4350 4605 8190
VTimings 4095 4158 4221 8190
Flags "Interlace" "+HSync" "+VSync"
EndMode
Mode "4095x4095" # vfreq 9.770Hz, hfreq 80.018kHz
DotClock 655.350000
HTimings 4095 4350 4605 8190
VTimings 4095 4158 4221 8190
Flags "Interlace" "+HSync" "+VSync"
EndMode
EndSection
Responder2
Você pode listar informações como exibições atualmente conectadas ou "conhecidas" usando xrandr
:
# list all known monitors
xrandr --listmonitors --verbose
# list active monitors
xrandr --listactivemonitors
Com um pouco de grep e tal, isso funcionaria. Vale a pena dar uma olhada nas man
páginas para ver se há funcionalidades ainda melhores para seu caso de uso.
Isso é o que descobri ser mais útil para um script
xrandr | grep " connected " # =>
# eDP-1
# HDMI-1 # <-- the monitor I want to detect
# AND -- to check if `HDMI-1` is connected
xrandr | grep " connected " | awk '{ print$1 }' | grep HDMI-1
# store connection status in a var
$hdmi_connection=$(xrandr | grep " connected " | awk '{ print$1 }' | grep HDMI-1)