В настоящее время я работаю над мини-проектом, для которого мне нужно настроить правило 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"
Если программы не запускаются в терминале, например cron, вы должны убедиться, что определенные переменные среды установлены в вашем сценарии до выдачи команд. Также команды должны либо иметь полный путь, либо их пути должны быть установлены в PATH в ваш скрипт.
Я создал этот маленький примерный скрипт, чтобы показать уведомление в течение 10 секунд, когда скрипт запускается cron:
$ 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 !"
Если программы не запускаются в терминале, например cron, вы должны убедиться, что определенные переменные среды установлены в вашем сценарии до выдачи команд. Также команды должны либо иметь полный путь, либо их пути должны быть установлены в PATH в ваш скрипт.
Я создал этот маленький примерный скрипт, чтобы показать уведомление в течение 10 секунд, когда скрипт запускается cron:
$ 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 !"