我目前正在开展一个小项目,需要为其设置一个 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 !"