A execução do programa a partir do udev não pode abrir uma janela [duplicada]

0

Eu tenho um script escrito em python:

#!/usr/bin/python3
from tkinter import messagebox
variable = messagebox.showinfo('title', 'question')

Este script python não faz mais nada do que mostrar uma caixa de mensagem na minha tela. Quero iniciar esse script sempre que conecto um drive USB ao meu computador.

Então criei um novo arquivo 10-myself.rules no diretório /etc/udev/rules.d /.

KERNEL="sdb",RUN+="/usr/bin/python3 /home/user/projects/path_to_python.py"

Mas não vejo nenhuma caixa de mensagem quando coloco a unidade USB no meu computador. Onde está o erro? Como posso depurar isso?

Eu também chamei o comando

udevadm control --reload-rules

E eu tentei mudar a regra para

KERNEL="sdb*",RUN+="/usr/bin/python3 /home/user/projects/path_to_python.py"

ou para a regra

KERNEL="sdb1",RUN+="/usr/bin/python3 /home/user/projects/path_to_python.py"

Se eu alterar o script para

file1 = open("/home/user/udev.txt", "w")
file1.write("Hello")
file1.close()

então este script funciona.

    
por kristian 26.02.2016 / 00:18

2 respostas

1

Eu acho que o código é executado como root, ou um usuário do udev, e que esses usuários não têm autoridade para conversar com o seu gerenciador de janelas e fazer janelas Tk ou algo parecido. Alguma forma de comunicação pode ajudar, por ex. o script udev escreve entradas de log ou envia mensagens para um soquete, que do outro lado de algo no ambiente do gerenciador de janelas pode ler mensagens e executar ações apropriadas.

    
por 26.02.2016 / 01:41
1

Quando você executa o script a partir de um shell interativo, você tem uma variável de ambiente DISPLAY indicando um servidor ao qual você tem autoridade para se conectar.

Quando é executado, por udev , não é esse o caso.

Em geral, você não quer que udev faça nada que dependa de ter o X11 instalado e funcionando, e você certamente não quer aumentar sua superfície de ataque dessa maneira.

Parece que você está procurando por um sistema de inscrição / notificação, para que você possa iniciar o ouvinte (como você) com sua sessão X e fazer o notificador ser executado a partir de udev . Você pode querer olhar para o DBus ou UDisks para isso; Como alternativa, você pode iniciar inotifywait assistindo à criação do arquivo do dispositivo e ler seus eventos no script (novamente, todos como usuário, não raiz).

    
por 26.02.2016 / 10:39

Tags