Ich habe ein Skript erstellt, um mein Wacom Bamboo-Tablet um 180 Grad zu drehen. Es funktioniert gut, wenn ich es als ich selbst (Benutzer) oder als Root ausführe, aber wenn ich von udev
(dh wenn ich das Tablet an einen usb
Port anschließe) gestartet werde, funktioniert es nicht.
Udev-Regeln :
SUBSYSTEMS=="usb", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d1", ATTRS{manufacturer}=="Wacom Co.,Ltd.", RUN+="/usr/local/bin/red-wacom-bamboo.sh"
Wacom-Skript /usr/local/bin/red-wacom-bamboo.sh :
#!/usr/bin/env bash
exec > /tmp/red-wacom.log
exec 2>&1
# I had to do this otherwise xsetwacom would say:
# "Failed to open Display ."
# Is there a way to do this without using my username?
export XAUTHORITY=/home/redsandro/.Xauthority
export DISPLAY=:0
/usr/bin/xsetwacom set "Wacom Bamboo 2FG 4x5 Pen stylus" Rotate half
/usr/bin/xsetwacom set "Wacom Bamboo 2FG 4x5 Finger touch" Rotate half
Ergebnis in /tmp/red-wacom.log :
Cannot find device 'Wacom Bamboo 2FG 4x5 Pen stylus'.
Cannot find device 'Wacom Bamboo 2FG 4x5 Finger touch'.
(Beachten Sie, dass der Fehler im Protokoll bedeutet, dass die udev-Regel selbst nicht das Problem ist.)
Ich habe versucht, ein sleep
im Skript festzulegen, vielleicht braucht es ein paar ms. Das hilft aber nicht.
- Warum funktioniert dieses Skript nicht, wenn es direkt von aufgerufen wird
udev
?- Wie behebe ich das?
- Kann ich ein Skript von
udev
einem bestimmten Benutzer aus aufrufen ? (zB Synchronisierung/home
mit externem Sicherungslaufwerk - / home / ist nur für den Benutzer sichtbar)
55
? Ich verwende immer die Idee, dass "unzählige Einträge zuletzt verarbeitet werden, daher ist es am besten, Zahlen für benutzerdefinierte Einträge zu überspringen."/usr/share/X11/xorg.conf.d/50-wacom.conf
ist 50 auf meinem System, also habe ich 55 ausgewählt, um danach zu kommen. Ich bin mir nicht sicher, ob das überhaupt wichtig ist.Wenn Sie das Gerät anschließen:
Sie können nicht
xsetwacom
vor Stufe 2 ausgeführt werden. Ihr Skript schlägt fehl, da Sie es in Stufe 1 ausführen , wenn X das Gerät noch nicht kennt.Sie können einige Einstellungen mit vornehmen
gnome-settings-daemon
. Ich glaube, es wird über D-Bus über das neue Gerät benachrichtigt , aber ich weiß nicht, wie das D-Bus-Ereignis aussieht. Versuchen Sie, den Bus mit auszuspionierendbus-monitor
.quelle
sleep
innerhalb von Sekunden zu verwenden. Beim Anschließen funktioniert das Tablet nach weniger als einer Sekunde. Wenn die Befehle ausgeführt werden, wird das Gerät bereits erkannt und von verwendetX
. Aber es funktioniert immer noch nicht?Es funktioniert, wenn Sie zwei Dateien erstellen, wobei ein Wrapper-Skript von udev aufgerufen wird, das wiederum das eigentliche Konfigurationsskript im Hintergrund aufruft. Das Konfigurationsskript muss für kurze Zeit in den Ruhezustand versetzt werden, damit X11 Zeit hat, seine Arbeit zu erledigen. Hier ist das Setup, das ich benutze:
Von udev aufgerufenes Wrapper-Skript (/usr/local/bin/setupwacom.sh):
Konfigurationsskript, das vom Wrapper-Skript aufgerufen wird (/usr/local/bin/setupwacom-post-X11.sh):
quelle
Keine der Antworten hier funktionierte für mich, und die Optionen, die ich festlegen wollte, konnten nicht angegeben werden in
xorg.conf
:Am Ende musste ich das Skript mit einem systemd-Dienst starten, der durch eine udev-Regel ausgelöst wurde:
Hersteller- und Modell-ID werden
lsusb
bei angeschlossenem Gerät ausgeführt.So laden Sie udev-Regeln neu:
Das
TAG+="systemd"
ermöglicht andere systemd Dienste (System oder Benutzer) auf dem Gerät (Register es als Geräteeinheit, siehe abhängenman systemd.device
). Um den Namen der Geräteeinheit zu finden, führen Sieudevadm monitor
das Tablet aus und schließen Sie es an. Ich bekommeUm zu überprüfen, ob systemd es aufnimmt, tun Sie es
Die Geräteeinheit ist also
sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.device
und kann in der systemd-Serviceeinheit verwendet werdenEs gibt eine Geräteeinheit pro USB-Port.
Aktivieren und laden Sie das Gerät anschließend mit
systemctl --user enable wacom.service
und neusystemctl --user daemon-reload
.Das Skript muss noch etwas schlafen, damit xsetwacom das Gerät findet und
$DISPLAY
und setzt$XAUTHORITY
.Type=oneshot
funktioniert einwandfrei beim Anschließen, wird jedoch nicht ausgeführt, wenn das Gerät beim Booten des Computers bereits angeschlossen war. Aus diesem Grund musste ich einen Benutzerdienst anstelle eines Systemdienstes verwenden, und das Gerät hat auch einenWantedBy=default.target
. Das Problem mit oneshot ist, dass es startx blockiert hat.Type=forking
undRestart=no
weist systemd an, nicht auf das Beenden des gegabelten Prozesses des Skripts zu warten, damit das Skript im Hintergrund schlafen und auf den Start von Xorg warten kann.quelle
\x
to\\x
in der Servicedatei umgehen. Meine WantedBy's sahen am Ende so aus:WantedBy=sys-devices-pci0000\:00-0000\:00\:14.0-usb1-1\\x2d4.device
und jetzt werden sie ausgelöst ... bevor sie es nicht taten.Die Problemumgehung von derobert ist nicht für alle Situationen geeignet (wenn Sie die xorg.conf nicht verwenden können).
Der vorgeschlagene Wrap und die
sleep
Lösung von Adrian funktionieren für mich irgendwie nicht (Ubuntu 16.04).Wenn Sie dies oben in Ihrem xsetwacom-Skript hinzufügen:
Sie können der Ausgabe entnehmen, dass das xsetwacom-Skript noch ausgeführt wird, bevor
xinput
das wacom erkannt wird. Egal wie lange du schläfst.Was ich vorschlage , ist hier eine andere Lösung / Abhilfe das kleine Programm bei denen ist einfacher als die Lösung von spelufo (was ich nicht ausprobiert) , sondern erfordert nur die Installation
at
Programm. (sudo apt install at
für Debian-Benutzer).Ändern Sie nun Ihr Wrapper-Skript (Adrians Antwort) wie folgt:
at
wird normalerweise verwendet, um einen Befehl einmal zu planen. Sie können beispielsweise eine Stunde im Voraus planenat now +1 hours -f yourscript.sh
. Da Sie jedoch nur Minuten / Stunden / Tage / Wochen hinzufügen können, habe ich diesenow
ohne Zusatz verwendet, sondern mich auf den Schlaf im xsetwacom-Skript verlassen.quelle
at now
ohne Gabelung zu arbeiten. Irgendein Grund dafür? Tatsächlich benötigt es mit derat
Methode nicht einmal das Wrapper-Skript. Sie können es direkt hinzufügen als.., RUN+="/usr/bin/at now -f script-path"
:)