2010-08-08 9 views
19

Come si fa a sapere se i monitor di un computer sono attivati ​​/ disattivati ​​dalla riga di comando in Linux? Ho sempre pensato ai monitor come dispositivi di sola uscita, ma ho notato che la finestra di dialogo Preferenze di Gnome Monitor ha una funzione di "rilevamento monitor". Questo può essere generalizzato per determinare se un monitor è fisicamente spento?Come determinare se il monitor LCD è acceso dalla riga di comando di Linux

+26

'echo 'Veloce!Premere un tasto se si vede questa :-) ' ' – paxdiablo

+0

Anche se non è tecnicamente 'dalla riga di comando', c'è uno script python [Su questa domanda SO] (http://stackoverflow.com/questions/10400236/how-to- osservare-cambiamenti-in-connessi-monitor-via-xlib), che fa il trucco ben – Barton

risposta

1

Si potrebbe desiderare di guardare l'output di

$ xset -q 

non sono sicuro se funzionerà, ma penso che la linea "Monitor è (on | off)" dovrebbe dirvi la risposta.

+2

mi dà ancora 'Monitor è On' anche quando lo spengo. – Thomas

+2

Ciò potrebbe mostrare solo se il monitor è collegato o meno. Non penso che ci sia un modo per vedere se è effettivamente acceso. Se è collegato, il sistema operativo presuppone che sia acceso. Probabilmente Gnome rileva il monitor solo quando è collegato non quando è acceso/spento. Credo che l'unico modo per provare questo fuori è quello di digitare il comando precedente, scollegare il monitor, premi invio, presa monitorare indietro e vedere cosa dice. Non posso testarlo b/c Sono su un laptop. – avacariu

+4

"Ancora mi dà il controllo è acceso anche quando lo spengo" - come puoi dire? Forse è abbastanza intelligente per tornare indietro e cambiare l'output quando rileva che hai acceso il monitor per controllare. Ora devo solo capire se la luce del frigo _ veramente _ si spegne quando chiudi la porta. – paxdiablo

5

È possibile ottenere alcune informazioni utilizzando l'utilità della riga di comando xrandr, se il driver video supporta questa estensione.

+3

Sembra darmi la stessa falsa lettura che ottengo da xset. – Cerin

13

La connessione VESA DDC è una connessione I2C che può essere utilizzata per interrogare la presenza del monitor.

Linux exposes the I2C device e programmi userland possono comunicare direttamente con il monitor con il codice come quella di cui http://jaffar.cs.msu.su/oleg/ddcci/

Avviso questo qui sotto: Control 0xe1: +/1/1 [SAM: Power control (0 - off/1 - on)]

# ddcci-tool /dev/i2c-2 -e -c -d 


ddcci-tool version 0.03 

Reading EDID : [email protected]/dev/i2c-2 
    Plug and Play ID: SAM00BA 
    Input type: Analog 

Using ddc/ci : [email protected]/dev/i2c-2 

Capabilities: 
(type(LCD)vcp(04 05 10 12 60(1 3) B0(1 2) B6 C6 C8 C9 D6(1 4) DC(1 2 3 4) DF)) 

Controls (valid/current/max): 
Control 0x04: +/0/1 [Reset Factory Defaults] 
Control 0x05: +/0/1 [SAM: Reset Brightness and Contrast] 
Control 0x06: +/0/1 [Reset Factory Geometry] 
Control 0x08: +/0/1 [Reset Factory Default Color] 
Control 0x0e: +/60/120 [SAM: Image Lock Coarse] 
Control 0x10: +/0/100 [Brightness] 
Control 0x12: +/50/100 [Contrast] 
Control 0x16: +/8/16 [Red Video Gain] 
Control 0x18: +/8/16 [Green Video Gain] 
Control 0x1a: +/8/16 [Blue Video Gain] 
Control 0x1e: +/0/2 [SAM: Auto Size Center] 
Control 0x20: +/50/100 [Horizontal Position] 
Control 0x30: +/25/54 [Vertical Position] 
Control 0x3e: +/39/50 [SAM: Image Lock Fine] 
Control 0x60: +/1/3 [Input Source Select] 
Control 0x62: +/0/100 [Audio Speaker Volume Adjust] 
Control 0x6c: +/140/255 [Red Video Black Level] 
Control 0x6e: +/127/255 [Green Video Black Level] 
Control 0x70: +/121/255 [Blue Video Black Level] 
Control 0xb0: +/0/2 [Settings] 
Control 0xb6: +/3/8 [???] 
Control 0xc6: +/1/1 [???] 
Control 0xc8: +/5/16 [???] 
Control 0xc9: +/1/0 [???] 
Control 0xca: +/2/2 [On Screen Display] 
Control 0xcc: +/2/11 [SAM: On Screen Display Language] 
Control 0xd6: +/1/4 [SAM: DPMS control (1 - on/4 - stby)] 
Control 0xdc: +/4/4 [SAM: MagicBright (1 - text/2 - internet/3 - entertain/4 - custom)] 
Control 0xdf: +/512/0 [VCP Version] 
Control 0xe0: +/0/2 [SAM: Color preset (0 - normal/1 - warm/2 - cool)] 
Control 0xe1: +/1/1 [SAM: Power control (0 - off/1 - on)] 
Control 0xe2: +/0/1 [???] 
Control 0xed: +/108/255 [SAM: Red Video Black Level] 
Control 0xee: +/101/255 [SAM: Green Video Black Level] 
Control 0xef: +/103/255 [SAM: Blue Video Black Level] 

Una questione interessante è se il monitor restituisce quel pezzo di dati, e in caso contrario, se risponde a tutti se è attualmente spento.

+2

Lo fa. È anche possibile accendere e spegnere il monitor dalla riga di comando. –

+2

DDCCI è ora ddccontrol: http://sourceforge.net/projects/ddccontrol/ Come ha detto Eren, lo fa, e si può anche farlo da soli con ', errori ddccontrol -r 0xE1 -w 0' – domen

+0

per il mio caso ddccontrol fuori (si lamenta del fatto che il monitor non sia supportato) quando il monitor è acceso e connesso, ma ddccontrol è silenzioso quando non è connesso o è spento. Sto ancora cercando un metodo per determinare se il monitor (TV) è su un altro ingresso però. Ma questo è probabilmente al di là di ciò che è fattibile. Inoltre, per ottenere questo correre sotto Ubuntu 12.04 si veda qui: http://www.techytalk.info/ubuntu/ddccontrol/ e probabilmente bisogno di fare un 'sudo modprobe i2c-dev' per farlo funzionare –

8

Da systembash.com, ecco il codice preso dal link, nel caso sarà giù qualche giorno:

#!/bin/bash 
export DISPLAY=:0.0 

if [ $# -eq 0 ]; then 
    echo usage: $(basename $0) "on|off|status" 
    exit 1 
fi 

if [ $1 = "off" ]; then 
    echo -en "Turning monitor off..." 
    xset dpms force off 
    echo -en "done.\nCheck:" 
    xset -q|grep "Monitor is" 
elif [ $1 = "on" ]; then 
    echo -en "Turning monitor on..." 
    xset dpms force on 
    echo -en "done.\nCheck:" 
    xset -q|grep "Monitor is" 
elif [ $1 = "status" ]; then 
    xset -q|sed -ne 's/^[ ]*Monitor is //p' 
else 
    echo usage: $(basename $0) "on|off|status" 
fi 
3

Non tutti i monitor supportano VESA DDC. La cosa potrebbe essere ancora più complicata se usi un dock.

D'altra parte, c'è un modo per verificare se le tue azioni vengono rilevate monitorando gli eventi kernel/udev. A tale scopo, per Fedora e RHEL, tipo seguente comando:

sudo udevadm monitor --property 

verrà visualizzato ogni kernel e udev eventi ha rilevato. Da ciò si può provare a scollegare/scollegare il cavo dati del monitor; collegare/scollegare il cavo di alimentazione del monitor; attivare gli stati di stand-by/on premendo il pulsante di accensione.

Se nessun output viene generato dopo un'azione, il sistema non può rilevarlo.

1

xset -q è la strada da percorrere per un pi greco di lamponi. Un controllo per vedere se la risposta contiene "Monitor attivo" è un ottimo modo per usare un pin gpio per spegnere una retroilluminazione LCD;

if(runOSCommand("xset -q").contains("Monitor is On")){ 
      System.out.println("Monitor is On"); 
      if screenLight.isHigh()) { 
       screenLight.low(); 
      } 
     }else{ 
      System.out.println("Monitor is Off"); 
      if (screenLight.isLow()) { 
       screenLight.high(); 
      } 
     } 


    public static String runOSCommand(String command){ 
    String s = null; 
    String string = ""; 
    Process p; 
    try { 
     p = Runtime.getRuntime().exec(command); 
     BufferedReader br = new BufferedReader(
      new InputStreamReader(p.getInputStream())); 
     while ((s = br.readLine()) != null){ 
//   System.out.println("line: " + s); 
      string += s; 
     } 
     p.waitFor(); 
//   System.out.println ("exit: " + p.exitValue()); 
     p.destroy(); 
    } catch (Exception e) {} 
    return string; 
} 
Problemi correlati