Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Как заставить udev запускать графические программы?  (Прочитано 1161 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Cxms

  • Автор темы
  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Есть правило в udev (/etc/udev/rules.d) которое при подключении устройства запускает скрипт,
но в нем не запускаются графические программы. Да, я знаю что так и должно быть,
но должен же быть какой-то способ обойти это ограничение?
Гуглил ен и рунет и перепробывал: добавлял DISPLAY=:0, писал полные пути к испол. файлам,
менял строку запуска в правиле на /usr/bin/sh, /usr/bin/bash с разными параметрами, и
/usr/bin/sudo. и еще много чего... но граф. проги не стартуют.
В скрипте для теста использую zenity:
Код: (bash) [Выделить]
#!/bin/bash

DISPLAY=:0 /usr/bin/zenity --info --width=200 --text="Test msg"
Есть ли вообще решение?

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3032
    • Просмотр профиля
Я этого не делал, поэтому советов давать не ммогу, но вот когда при разрешённом
автомонтировании вставляется флешка, то запускается именно графический
файл-менеджер, так что должно быть возможно. Посмотрите udev-правило для
usb-flash и xml-файл у себя, в котором включается автомонтирование.
Пётр.

Оффлайн Cxms

  • Автор темы
  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Цитировать
когда при разрешённом автомонтировании вставляется флешка, то запускается именно графический
файл-менеджер
У меня lubuntu, и не флешка а модем, и при разрешённом автомонтировании флешек файл-менеджер не запускается.
Вот вывод поиска RUN в /lib/udev/rules.d
grep -r RUN /lib/udev/rules.d:
(Нажмите, чтобы показать/скрыть)

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3032
    • Просмотр профиля
А сам скрипт ведь запускается? Тогда перенаправьте его вывод в файл
и смотрите, на что жалуется.
Пётр.

Оффлайн Cxms

  • Автор темы
  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Сделал, все запускается и работет:

Правило udev:
KERNEL=="ttyUSB0", SUBSYSTEM=="tty", ACTION=="add", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", RUN+="/путь/до/Pre_Start.sh"
Значения ATTRS{idVendor}=="XXXX" и ATTRS{idProduct}=="XXXX"
смотреть в выводеudevadm monitor --environment --udevпосле подключения модема, или из lsusb.

Pre_Start.sh
Код: (bash) [Выделить]
#!/bin/bash

/usr/bin/script -f -c "/bin/bash /путь/до/Start.sh" "/путь/до/лога.LOG" & exit 0
Без Pre_Start.sh - скрипт запускается но модем не определяется.
Не понял почему, но модем определяется только с запуском через script,
менял на /bin/bash "/путь/до/Start.sh" & exit 0 - не определялся.

Start.sh
Код: (bash) [Выделить]
#!/bin/bash

# Путь до скрипта использующего граф. программы и
# который запустится от юзера при подключении модема
SCRIPT="/путь/до/скрипта.sh"

# Значение PATH из "echo $PATH"
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

LocalDisplay=':0'
export DISPLAY=$LocalDisplay

X11User=$(who | grep " :0" | cut -f1 -d ' ')
[ "$X11User" ] || exit

[ -e /home/$X11User/.bashrc ] && source /home/$X11User/.bashrc

su $X11User -c "/bin/bash "$SCRIPT" & exit 0"
Все пути указывать полные т.к. запускается все от рута, и с не нормальным окружением.

В скрипте указанном в переменной SCRIPT в начале нужно прописать задержку (sleep N) для
ожидания инициализации модема которую можно найти таким скриптом (прописав путь в SCRIPT):

Код: (bash) [Выделить]
#!/bin/bash

START_TIME=$(date +"%s")

while sleep 1; do
[ "$(nmcli -t -f state dev status)" ] && break
done

END_TIME=$(date +"%s")

let INIT_DELAY=END_TIME-START_TIME

zenity --info --text "Задержка (сек.) = $INIT_DELAY"

Для надежности прибавить к результату 2-3 сек.

Мой скрипт (для Теле2) который показывает при подключении модема баланс, остаток трафика, все смс, +удаление всех смс:
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 04 Января 2016, 13:41:01 от Cxms »

 

Страница сгенерирована за 0.051 секунд. Запросов: 25.