Ответ Radu, похоже, не работает для меня 16.04. Вместо того, чтобы пытаться бороться с проблемой DISPLAY, которая, кажется, меняется с разными версиями, я об этом немного по-другому. Я создаю один скрипт, который вызывается двумя способами. Правило udev вызывает сценарий, отправляя какой-то вывод в именованный канал. При входе в систему сценарий также запускается в сервисном режиме. Здесь он прослушивает трубку и запускает желаемую команду GUI.
В качестве примера я хотел бы получать уведомления о USB-устройствах хранения, когда они подключены, и, в частности, мне нравится знать, какой путь устройство и его серийный номер (что может показаться странным, но у меня есть веские причины). Вот сценарий, который я использую для выполнения этого.
#!/bin/bash
# script name: usb-notify.sh
# This script needs to be called at logon with "service" parameter
# This script needs to be called by udev on USB insertion with no parameter
pipe="/tmp/usb-notifications"
if [ "$1" == "service" ]; then
# create the named pipe that will help us trigger events from udev
rm "$pipe"
mkfifo "$pipe"
# This outer while loop ensures that we can process multiple triggers
while true
do
# This inner while loop reads individual trigger events
while read info
do
# run some GUI command. Here, I'm running notify-send
notify-send "USB Inserted" "$(echo -e $info)"
done < "$pipe"
done
else
# Here's where udev triggers our event. If you don't need to pass any arguments
# you could just as easily pass an empty line as a trigger for the service.
[ -e "$pipe" ] && echo "Device: $DEVNAME\\\nSN: $ID_SERIAL_SHORT" > "$pipe"
fi
Этот сценарий затем должен быть вызван двумя способами. Во-первых, для вызова этого скрипта необходимо создать правило udev. Это можно сделать с помощью следующей команды (очевидно, вы должны изменить это, чтобы посмотреть, какое устройство должно запускать ваш скрипт):
echo 'ACTION=="add",KERNEL=="sd?",RUN+="[path-to-script]/usb-notify.sh"' | sudo tee -a /etc/udev/rules.d/80-USB.rules
Во-вторых, вам нужно вызвать этот скрипт с параметром «service» на авторизоваться. Итак, откройте программу «Запуск приложений» и добавьте запись, которая запускает «[путь к вашему скрипту] /usb-notify.sh service»
Этот скрипт может быть изменен, чтобы запускать практически любой Приложение GUI для событий udev. Если вы не хотите, чтобы другие пользователи могли смотреть ваш канал, вы должны, вероятно, установить ограничительные права на него.