Ich möchte in der Lage sein, über die Kommandozeile festzustellen, ob ein Monitor an einen Computer angeschlossen ist (damit ich über ein Skript entscheiden kann, ob X ausgeführt werden soll oder nicht). Wie mache ich das?
Ich kann mich nicht auf die Anwesenheit von X verlassen, daher scheidet alles aus, was auf einer gültigen X-Anzeige beruht, wie z . B. xrandr
. Ich habe festgestelltddccontrol
, aber die Ausgabe ist mehrzeilig und nicht einfach zu analysieren. (Es sagt mir, dass die Informationen theoretisch in der von mir gewünschten Weise verfügbar sind.) Gibt es ein skriptfreundlicheres Programm, das mir sagen kann, ob ein Monitor an das System angeschlossen ist?
Die meisten Systeme, auf denen ich dies ausführen möchte, laufen unter Fedora 20.
Antwort1
Ich habe dies nicht auf Fedora 20 ausprobiert (nur auf Ubuntu 13.04), aber die Theorie in meinem Kopf ist gut.
Sie könnten versuchen, read-edid zu verwenden (http://www.polypux.org/projects/read-edid/)
Dadurch sollte eine XF86-kompatible Modeline entstehen, die Sie analysieren können.
So dasskönntefunktioniert. Vielleicht ist es sogar einfacher und Sie könnten einfach den Exit-Code überprüfen.
$ 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
Antwort2
Sie können Informationen wie aktuell verbundene oder „bekannte“ Displays auflisten mit xrandr
:
# list all known monitors
xrandr --listmonitors --verbose
# list active monitors
xrandr --listactivemonitors
Mit ein bisschen Grepping und so würde das funktionieren. Es lohnt sich, einen Blick auf die man
Seiten zu werfen, um zu sehen, ob es für Ihren Anwendungsfall noch bessere Funktionen gibt.
Das ist, was ich für ein Skript am nützlichsten fand
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)