Моя цель состоит в том, чтобы инициировать уведомление с пользовательскими действиями, когда определенное устройство хранения смонтировано. Уведомления сделаны в Python с pynotify
Я работаю lsusb
для получения idVendor устройства и idProduct параметры и я создаем правило udev /etc/udev/rules.d/100-mount-notifybackup.rules
с этим содержанием:
ACTION=="add", SUBSYSTEM=="block", ATTR{partition}=="*", ATTRS{idVendor}=="0xxx", ATTRS{idProduct}=="1xxx", TAG+="systemd", ENV{SYSTEMD_WANTS}+="notify_backup.service"
Когда внешнее устройство хранения данных присоединяется, правило запускает systemd сервис (/etc/systemd/system/notify_backup.service
)
[Unit]
Description=notify backup
[Service]
User=your_user
Group=your_user
Type=oneshot
RemainAfterExit=no
ExecStart=/home/your_user/bin/notifybackup.sh
[Install]
этот сервис выполняется notifybackup.sh
это запускает скрипт Python
#!/bin/bash
script_name=$0
script_full_path=$(dirname "$0")
/usr/bin/python -v $script_full_path/notify.py > /home/your_user/fileName.txt 2>&1
Сценарий Python:
import gi
gi.require_version('Notify', '0.7')
from gi.repository import Notify
from subprocess import call
#call('ls')
#Notify.init("App Name")
#Notify.Notification.new("Hi").show()
def ignore_cb():
return None
Notify.init("Test Capabilities")
caps = Notify.get_server_caps()
if caps and 'actions' in caps:
# We support actions, so add a button.
notification = Notify.Notification.new("Can we use actions?", \
"Yup, we sure do.")
notification.add_action("ignore", "Ignore", ignore_cb)
else:
notification = Notify.Notification.new("Can we use actions?", \
"Nope, we don't support actions.")
notification.show()
Уведомление появляется, когда я запускаю скрипт удара, но это дает мне эту ошибку, когда я вставляю устройство хранения:
(process:9357): libnotify-WARNING **: 16:37:48.548: Failed to connect to proxy
Traceback (most recent call last):
File "/home/gaia/bin/notify.py", line 23, in <module>
notification.show()
GLib.Error: g-io-error-quark: Cannot autolaunch D-Bus without X11 $DISPLAY (0)
это пытается запустить скрипт Python в оболочке?
Как долгий процесс обучения для меня, я поддерживал такие взломы. Как тот для Вашего сценария, вероятно, нужно для адреса DBus.., см. этот ответ:
Как приостановить воспроизведение VLC, когда наушники разъединяются?
Команды действия Udev выполняются в песочнице. Таким образом, это пропускает переменные настольной среды и сервисы. Таким образом, правила Udev не посещены, чтобы использоваться и подключаться непосредственно к GUI и Пользовательской среде.
Чтобы быть завершенными, проверьте Википедию - Udev для ее целей.
Я рекомендовал бы делать его тот же путь, как любой разработчик пользовательского приложения должен сделать.. Пользуйтесь библиотекой. Я не забочусь который: низкий уровень один для udev
или высокого уровня как udisks2
(для DE GTK)...
При рассмотрении того взлома от предполагаемого проектирования системы Вы будете видеть, насколько ужасный это. Как низкоуровневая система могла передать на высоком уровне один!.