Я сделал скрипт для поворота планшета Wacom Bamboo на 180 градусов. Он работает нормально, когда я выполняю его как себя (пользователя) или root, но при запуске из udev
(т.е. при подключении планшета к usb
порту) он не будет работать.
Удев правит :
SUBSYSTEMS=="usb", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d1", ATTRS{manufacturer}=="Wacom Co.,Ltd.", RUN+="/usr/local/bin/red-wacom-bamboo.sh"
Скрипт Wacom /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
Результат в /tmp/red-wacom.log :
Cannot find device 'Wacom Bamboo 2FG 4x5 Pen stylus'.
Cannot find device 'Wacom Bamboo 2FG 4x5 Finger touch'.
(Обратите внимание, что ошибка в журнале означает, что само правило udev не является проблемой.)
Я попытался установить sleep
в сценарии, может быть, нужно несколько мс. Но это не помогает.
- Почему этот скрипт не работает при вызове напрямую из
udev
?- Как я могу это исправить?
- Могу ли я вызвать скрипт от
udev
определенного пользователя? (например, синхронизация/home
с внешним резервным диском - / home / видна только его пользователю)
55
? Я всегда использую идею, что «бесчисленные записи обрабатываются последними, поэтому лучше пропустить числа для пользовательских записей»./usr/share/X11/xorg.conf.d/50-wacom.conf
50 в моей системе, поэтому я выбрал 55, чтобы последовать за ним. Не уверен, что даже имеет значение.Когда вы подключаете устройство:
Вы не можете запустить
xsetwacom
до этапа 2. Ваш сценарий дает сбой, потому что вы запускаете его на этапе 1, когда X еще не знает устройство.Вы можете установить некоторые настройки с помощью
gnome-settings-daemon
. Я полагаю, что он получает уведомление о новом устройстве через D-Bus , но я не знаю, как выглядит событие D-Bus. Попробуйте шпионить в автобусе сdbus-monitor
.источник
sleep
с кучей секунд. При подключении планшет работает менее чем за секунду, поэтому к моменту выполнения команд устройство уже обнаруживается и используетсяX
. Но все равно это не работает?Это работает, если вы создаете два файла, один скрипт-обертка вызывается udev, который, в свою очередь, вызывает фактический скрипт конфигурации в фоновом режиме. Сценарий конфигурации должен на короткое время спать, чтобы у X11 было время выполнить свою работу. Вот настройки, которые я использую:
Скрипт оболочки, вызываемый udev (/usr/local/bin/setupwacom.sh):
Скрипт конфигурации, вызываемый скриптом-оболочкой (/usr/local/bin/setupwacom-post-X11.sh):
источник
Ни один из ответов здесь не работал для меня, и параметры, которые я хотел установить, не могли быть указаны в
xorg.conf
:В итоге мне пришлось запустить скрипт с помощью службы systemd, запускаемой по правилу udev:
Идентификатор поставщика и модели можно найти работающим
lsusb
когда устройство подключено.Чтобы обновить правила udev:
TAG+="systemd"
Позволяет другим Systemd услуги (системные или пользовательские), зависит от устройства (регистрирует его в качестве блока устройства смman systemd.device
). Чтобы узнать название устройства, запуститеudevadm monitor
и подключите планшет. я получилЧтобы проверить, что systemd собирает его, выполните
Таким образом, блок устройства есть
sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.device
, и его можно использовать в сервисном модуле systemd.Для каждого порта USB имеется один блок устройства.
Затем включите и перезагрузите устройство кнопками
systemctl --user enable wacom.service
иsystemctl --user daemon-reload
.Сценарию все еще нужно немного поспать, чтобы xsetwacom нашел устройство, а также установил
$DISPLAY
и$XAUTHORITY
.Type=oneshot
работает нормально при подключении, но не запускается, если устройство уже подключено при загрузке компьютера. Вот почему мне нужно было использовать пользовательский сервис вместо системного, и поэтому устройство также имеетWantedBy=default.target
. Проблема с oneshot в том, что он блокировал startx.Type=forking
иRestart=no
сообщает systemd не ждать завершения разветвленного сценария, чтобы сценарий мог спать в фоновом режиме, ожидая запуска Xorg.источник
\x
чтобы\\x
в файле службы. В конце концов, мой WantedBy выглядел так:WantedBy=sys-devices-pci0000\:00-0000\:00\:14.0-usb1-1\\x2d4.device
и теперь они сработали ... раньше, чем не сделали.Обходной путь derobert не подходит для всех ситуаций (если вы не можете использовать xorg.conf).
Предложенное
sleep
Адрианом обертывание и решение почему-то у меня не работают (Ubuntu 16.04).Если вы добавите это в начало вашего скрипта xsetwacom:
Из вывода видно, что скрипт xsetwacom каким-то образом все еще выполняется до
xinput
как узнает о wacom. Неважно, как долго вы спите.То , что я предлагаю здесь другое решение / обходной путь , используя небольшую программу , в которой проще , чем решение по spelufo (который я не пробовал) , но только требует , чтобы установить
at
программу. (sudo apt install at
для пользователей Debian).Теперь измените ваш скрипт-оболочку (ответ Адриана) на что-то вроде этого:
at
обычно используется для планирования команды один раз, например, вы можете запланировать ее на час впередat now +1 hours -f yourscript.sh
. Но так как вы можете добавить только минуты / часы / дни / недели, которые я использовалnow
без добавления, но положитесь на сон в скрипте xsetwacom.источник
at now
без разветвления. Есть причина для этого? На самом деле с этимat
методом ему даже не нужен скрипт-обертка. Вы можете непосредственно добавить это как.., RUN+="/usr/bin/at now -f script-path"
:)at