来自 udev 规则的自定义通知

来自 udev 规则的自定义通知

我的目标是在安装特定存储设备时触发带有自定义操作的通知。通知在 Python 中使用pynotify

我运行以获取设备的 idVendor 和 idProduct 参数,并使用以下内容lsusb创建 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()

当我运行 bash 脚本时会出现通知,但是当我插入存储设备时会出现此错误:

(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)

它是尝试在 shell 中运行 python 脚本吗?

答案1

  • 对我来说这是一个漫长的学习过程,我支持这样的黑客攻击。就像你的脚本可能需要 DBus 地址一样……,请参阅此答案:

    当耳机断开连接时如何暂停 VLC 播放?

  • Udev 操作命令在沙箱中运行。因此它缺少桌面环境变量和服务。因此 Udev 规则不被考虑用于直接连接到 GUI 和用户环境。

    为了完整起见,请检查维基百科-Udev以实现其目标。

    我建议像任何用户应用程序开发人员一样使用库。我不在乎哪一个:低级库udev或高级库udisks2(例如 GTK 的 DE)...

  • 如果你从系统设计的角度来看待这个 hack,你会看到它有多丑陋。低级系统如何能够中继高级系统!

相关内容