Ubuntu 16.04 - udev 规则和通知发送

Ubuntu 16.04 - udev 规则和通知发送

我目前正在开展一个小项目,需要为其设置一个 udev 规则,当外部存储驱动器插入机器时,该规则会向桌面发送通知。

此通知应包含驱动器的一些基本信息,如 SN、型号、大小等...

我能够让 udev 规则运行脚本并将通知发送到桌面,但我的问题是通知气泡只出现 5 秒然后消失。

我尝试在命令中设置到期时间,但它仍然执行相同的操作。奇怪的是,如果我在终端中单独运行该命令,它就完全没问题。

这是我的 udev 规则脚本

# Mark new block devices as read-only. Only keep the main drive as RW
KERNEL=="sd[c-z]*",ACTION=="add", SUBSYSTEM=="block",  KERNEL!="ram*",RUN+="/home/notify-send.sh '%E{DEVNAME}' '%E{ID_MODEL}'"

这是我的notify-send.sh脚本

export DISPLAY=:0
export XAUTHORITY=/home/akl_dennis/.Xauthority 
device_name=$DEVNAME
model_id=$ID_MODEL
icon="/home/READ-WRITE.png"
sn=$(hdparm -I $device_name |awk '/Serial Number:/ { print $3}')
size=$(lsblk $device_name |awk 'FNR ==2 {print $4}')
disk_status=$(blockdev --getro $device_name)
if [ "$disk_status" == 0 ]; then
   disk_status="READ-WRITE"
else
   disk_status="READ-ONLY"
   icon="/home/READ-ONLY.png"
fi

  notify-send -i $icon  "USB INSERTED" "Device: $device_name\\nSerial Number: $sn\\nModel: $model_id\\nSize: $size\\nStatus: $disk_status"

我注意到有一些错误日志可能与该问题有关,但我不确定如何解释它

org.freedesktop.Notifications[2938]: ** (notify-osd:2942): WARNING **: dnd_is_idle_inhibited(): got error "The name org.gnome.SessionManager was not provided by any .service files"

答案1

如果程序不在终端中运行,例如 cron,则必须确保在发出命令之前在脚本中设置某些环境变量。
此外,命令必须具有完整路径,或者必须在脚本的 PATH 中设置其路径。

我创建了这个小示例脚本,当脚本由 cron 启动时显示 10 秒的通知:

$ ls -l DoSomething 
-rwxrwxr-x 1 willem willem 286 May 31 12:12 DoSomething

$ crontab -l
# m h  dom mon dow   command
* * * * * /home/willem/DoSomething > /tmp/DoSomething.log 2> /tmp/DoSomething.err

$ cat DoSomething 
#!/bin/bash
eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME xfce4-session)/environ)";
echo "Setting vars..."
export DISPLAY=:0
export XAUTHORITY=/home/willem/.Xauthority

echo "Calling notify..."
/usr/bin/notify-send "Hello, world !" -t 10000
echo "Done !"

相关内容