С твоим правилом udev все в порядке. Проблема в том, что ваш скрипт, как и сам udev, работает
- как root - не как ваша собственная учетная запись пользователя;
- как услуга - вне вашего сеанса входа в систему;
и, следовательно, не имеют доступа к вашему дисплею X11 или сеансовой шине DBus.
Помните , что Linux, как и Unix, поддерживает несколько одновременных сеансов входа в систему с самого первого дня, так что не «пользователь»; может быть несколько пользователей, имеющих несколько дисплеев X11 и несколько шин DBus (к которым может даже не подключаться сервер X11).
Обычный обходной путь - заставить скрипт всегда выбирать первый дисплей X11 (установив DISPLAY=":0"
внутри скрипта). Однако это не гарантированно работает - даже на однопользовательском ПК могут работать два или более дисплеев X11 (например, ваш собственный рабочий стол может быть по адресу :1
, а :0
может быть экраном входа или не работать вообще),