Sua regra do udev está bem. O problema é que seu script, assim como o próprio udev, é executado
- como raiz - não como sua própria conta de usuário;
- como um serviço - fora de sua sessão de login;
e, portanto, não tem acesso ao seu monitor X11 ou ao seu barramento de sessão DBus.
Lembre-se que o Linux, como Unix, suportou várias sessões de login simultâneas desde o primeiro dia, então não há " o usuário"; pode haver vários usuários com vários monitores X11 e vários barramentos DBus (que podem nem ter um servidor X11 conectado).
Uma solução comum é fazer com que o script sempre escolha a primeira exibição do X11 (configurando DISPLAY=":0"
dentro do script). No entanto, isso :1
, enquanto :0
pode estar a tela de login ou não está sendo executada).