¿Puede Linux saber desde la línea de comando si hay un monitor conectado?

¿Puede Linux saber desde la línea de comando si hay un monitor conectado?

Me gustaría poder saber, desde la línea de comando, si un monitor está conectado a una computadora (para poder decidir a partir de un script si X debería estar ejecutándose o no). ¿Cómo puedo hacer eso?

No puedo depender de la presencia de X, por lo que eso descarta cualquier cosa que dependa de una visualización X válida, como xrandr. He encontradoddccontrol, pero su salida es de varias líneas y no es trivial de analizar. (Me dice que la información está teóricamente disponible en la forma que quiero). ¿Existe algún programa más compatible con scripts que pueda decirme si un monitor está conectado al sistema?

La mayoría de los sistemas en los que me gustaría ejecutar esto ejecutan Fedora 20.

Respuesta1

No he probado esto en fedora 20 (solo en Ubuntu 13.04), pero la teoría que tengo en la cabeza es sólida.

Podrías intentar usar read-edid (http://www.polypux.org/projects/read-edid/)

Lo que debería proporcionarle una línea de modelo compatible con XF86. Que puede analizar.

De modo quepodríatrabajar. Quizás sea incluso más fácil y podrías simplemente verificar el código de salida.

$ 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

Respuesta2

Puede enumerar información como pantallas actualmente conectadas o "conocidas" usando xrandr:

# list all known monitors
xrandr --listmonitors --verbose

# list active monitors
xrandr --listactivemonitors

Con un poco de grepping y demás, esto funcionaría. Vale la pena mirar las manpáginas para ver si hay una funcionalidad aún mejor para su caso de uso.

Esto es lo que he encontrado más útil para un 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)

información relacionada