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.