Você já encontrou a resposta. O script (zenity) precisa de um X Window Server para exibir uma mensagem. O script é executado a partir de udev e não possui exibição anexada a ele. Você pode resolver isso instalando a variável DISPLAY em seu script, ou seja,
DISPLAY=:0; export DISPLAY
A desvantagem disso é que ele funciona apenas se você for o único usuário e / ou conhecer a exibição antecipadamente. Se houver vários usuários em seu sistema, a exibição pode ser qualquer outra coisa, por exemplo, :1 , :2 e assim por diante. Ou outro usuário recebe a mensagem zenity na tela dele.
Uma abordagem melhor seria dividir a detecção do evento e a interação com o usuário ou a exibição da mensagem.
Para isso, você pode criar um script ou programa, que é executado em sua sessão da GUI e escuta um acionador de um daemon ou do script do acionador do udev.
Uma terceira possibilidade poderia ser conectar-se ao udisks-daemon e solicitar informações, quando o dispositivo externo estiver conectado. Você pode tentar udisks --monitor ou udisks --monitor-detail para isso e analise a saída, sempre que um evento acontecer.
Parece haver um comando udisksctl , que faz o mesmo com um pouco sintaxe diferente. Talvez seja apenas uma versão mais recente do comando udisks .
Você também pode ver algumas ferramentas do Gui, como Discos do GNOME , que também contam com o sistema udev / udisks.
Atualizar :
As invocações múltiplas geralmente surgem do relatório dos vários subsistemas. Você pode ver que, ao registrar o ambiente em algum arquivo de log no script /usr/local/bin/test.sh
umask 077
mkdir -p /tmp/udevtest.d
env >>/tmp/udevtest.d/udevtest.log
Quando eu plugo um pendrive, recebo os seguintes relatórios
$ grep -e ACTION -e SUBSYSTEM /tmp/udevtest.d/udevtest.log
ACTION=add
SUBSYSTEM=usb
ACTION=add
SUBSYSTEM=usb
ACTION=add
SUBSYSTEM=scsi
ACTION=add
SUBSYSTEM=scsi_host
ACTION=add
SUBSYSTEM=scsi
ACTION=add
SUBSYSTEM=scsi
ACTION=add
SUBSYSTEM=scsi_disk
ACTION=add
SUBSYSTEM=scsi_generic
ACTION=add
SUBSYSTEM=scsi_device
ACTION=add
SUBSYSTEM=bsg
ACTION=add
SUBSYSTEM=block
ACTION=add
SUBSYSTEM=block
Você também pode adicionar DEVTYPE para distinguir entre os dois relatórios usb ou disk .
Portanto, para reduzir os relatórios a apenas algumas ou mesmo apenas uma, você deve ser mais específico e adicionar condições adicionais ao seu arquivo de regras do udev, por exemplo, escolha SUBSYSTEM=scsi_disk ou o que for apropriado para o seu dispositivo.