Ändern Sie die Systemeinstellungen abhängig davon, ob ein Monitor angeschlossen ist

6

Ich verwende derzeit einen Laptop mit Ubuntu 12.04. Wenn ich bei der Arbeit bin, schließe ich einen Monitor, eine Maus und eine Tastatur an. Dann schließe ich den Bildschirm meines Laptops und verwende ihn als normalen PC. Jedes Mal, wenn ich es ein- und ausstecke, muss ich meine Systemeinstellungen ändern, da mein Laptop normalerweise beim Schließen des Bildschirms im RAM-Modus angehalten wird. Außerdem muss ich ändern, wo meine Grafikkarte meinen Desktop anzeigen soll.

Gibt es eine Möglichkeit, ein Skript auszuführen, wenn ein externer Monitor oder ein USB-Gerät angeschlossen oder ausgeschaltet ist? Wenn ja, gibt es eine Möglichkeit, meine Systemeinstellungen durch ein Shell-Skript zu ändern? Wenn nicht, gibt es eine andere Möglichkeit, dies zu tun?

Wauzl
quelle
Ich habe es geschafft, ein Shell-Skript auszuführen, indem ich eine Datei mit dem Namen hinzugefügt 90-monitor-hotplug.ruleshabe, /etc/udev/rules.ddie die einzelne Zeile enthältSUBSYSTEM=="drm", ACTION=="change", RUN+="/path/to/executable.sh"
Wauzl
Ich habe es auch geschafft, die Energieeinstellungen einer Shell zu ändern. Dies funktioniert mit gsettings. Zum Beispiel, um Ubuntu zum Aufhängen zu bringen, wenn der Deckel im Batteriemodus geschlossen wirdgsettings set org.gnome.settings-daemon.plugins.power lid-close-ac-action 'suspend'
Wauzl
Ich habe auch herausgefunden, wie ich das Verhalten meiner Monitore ändern kann. Dies kann nicht durchgeführt werden, gsettingsda dies direkt erfolgt xrand. Für eine Liste der verfügbaren Ausgänge Typ xrandr-tool outputsund zum Ausschalten zum Beispiel den VGA-Ausgangstyp xrandr --output VGA1 --offund zum erneuten Einschalten xrandr --output VGA1 --auto. Ich denke, das kann besser gemacht werden, aber es wird für mich ausreichen. Ich werde versuchen, alles, was ich jetzt weiß, zusammenzufügen und selbst eine Antwort zu posten.
Wauzl

Antworten:

5

Um diese Methode verwenden zu können, müssen Sie zunächst prüfen, ob Ihre Grafikkarte ein udev-Ereignis sendet, wenn ein VGA-Monitor angeschlossen ist. Öffnen Sie dazu ein Terminal, geben Sie udevadm monitor --propertyeinen Monitor ein und schließen Sie ihn an etwas wie das:

KERNEL[7671.540341] change   /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
ACTION=change
DEVNAME=dri/card0
DEVPATH=/devices/pci0000:00/0000:00:02.0/drm/card0
DEVTYPE=drm_minor
HOTPLUG=1
MAJOR=226
MINOR=0
SEQNUM=2296
SUBSYSTEM=drm
UDEV_LOG=3

UDEV  [7672.099723] change   /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
ACTION=change
DEVNAME=/dev/dri/card0
DEVPATH=/devices/pci0000:00/0000:00:02.0/drm/card0
DEVTYPE=drm_minor
HOTPLUG=1
MAJOR=226
MINOR=0
SEQNUM=2296
SUBSYSTEM=drm
TAGS=:udev-acl:
UDEV_LOG=3
USEC_INITIALIZED=20836591

Wenn Sie kein Ereignis erhalten, ist diese Methode nicht möglich.

Als nächstes wird eine Regel für udev erstellt. Dies kann durch Erstellen einer Datei erfolgen /etc/udev/rules.d/90-monitor-hotplug.rules. Öffnen Sie dazu ein Terminal und geben Sie ein gksudo gedit /etc/udev/rules.d/90-monitor-hotplug.rules. Das gksudowird benötigt, da nur root Dateien in dieser Direktive erstellen darf. Fügen Sie dann die folgende Zeile in die Datei ein und speichern Sie sie:

SUBSYSTEM=="drm", ACTION=="change", RUN+="/bin/su user -c '/home/user/bin/monitorhotplug.sh'"

Natürlich müssen Sie das Wort userdurch Ihren eigenen Benutzernamen ersetzen . Dies führt dazu, dass udev den dahinter angegebenen Befehl ausführt RUN. Der Befehl führt die Datei /home/user/bin/monitorhotplug.shals Benutzer aus. Diese Datei muss jetzt erstellt werden.

Öffnen Sie dazu ein Terminal und geben Sie ein gedit /home/user/bin/monitorhotplug.sh. Denken Sie daran, userdurch Ihren eigenen Benutzernamen zu ersetzen . Fügen Sie nun das folgende Skript in die Datei ein und speichern Sie es:

#!/bin/bash

# we need some environment variables
export DISPLAY=:0
export XAUTHORITY=~/.Xauthority
eval $(sed -n '/^#/! { s/^/export /; s/$/;/; p }' ~/.dbus/session-bus/*-${DISPLAY//:/})

# if a VGA monitor is plugged in:
if [ $(cat /sys/class/drm/card0-VGA-1/status) = "connected" ]; then
    # set my power settings
   gsettings set org.gnome.settings-daemon.plugins.power lid-close-ac-action 'nothing'
   gsettings set org.gnome.settings-daemon.plugins.power lid-close-battery-action 'nothing'
    xrandr --output VGA1 --auto
    # turn off laptop screen
    xrandr --output LVDS1 --off
# in case of anything else reset to standard options
else
   # reset my power settings
   gsettings set org.gnome.settings-daemon.plugins.power lid-close-ac-action 'suspend'
   gsettings set org.gnome.settings-daemon.plugins.power lid-close-battery-action 'suspend'
   # xrandr does the rest alone
    #xrandr --output VGA1 --off
    #xrandr --output LVDS1 --auto
fi

Jetzt muss die Datei ausführbar gemacht werden. Öffnen Sie dazu ein Terminal und geben Sie ein chmod +x /home/user/bin/monitorhotplug.sh.

Jetzt sollte es funktionieren: 1. Wenn Sie einen VGA-Monitor anschließen, wird Ihr interner Laptop-Bildschirm (LVDS) ausgeschaltet und Ihr Laptop wird nicht angehalten, wenn Sie den Deckel schließen. 2. Wenn Sie den Monitor ausstecken oder ein anderes Ereignis mit Monitoren auftritt, werden die Energieeinstellungen zurückgesetzt, um bei geschlossenem Deckel anzuhalten.

Es gibt noch ein kleines Problem: Wenn Sie Ihren Monitor angeschlossen und den Deckel geschlossen haben, sperrt Ubuntu den Bildschirm, sodass Sie die Maus bewegen und Ihr Passwort erneut eingeben müssen.

Ich hoffe das hilft jemandem. Ich persönlich genieße meine kleine DIY-Dockingstation. :) :)

Wauzl
quelle
1
Diese großartige Antwort hat für mich fast sofort funktioniert. Ich musste zwei Änderungen vornehmen und fasse hier zusammen, falls jemand es nicht zum Laufen bringt. 1) Mein Laptop-Display hieß tatsächlich eDP1 anstelle von LDVS1 (Sie können dies mit xrand überprüfen). 2) Mein Konto hatte keine Berechtigungen für den Ordner ~ / .dbus, daher musste ich den Sudo-Chown-Benutzer -R ~ / .dbus ausführen damit es funktioniert.
HYS