udev에서 실행되는 프로그램은 창을 열 수 없습니다.

udev에서 실행되는 프로그램은 창을 열 수 없습니다.

Python으로 작성된 스크립트가 있습니다.

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

이 Python 스크립트는 화면에 메시지 상자를 표시하는 것 외에는 아무 작업도 수행하지 않습니다. USB 드라이브를 컴퓨터에 연결할 때 이 스크립트를 시작하고 싶습니다.

그래서 /etc/udev/rules.d/ 디렉토리에 10-myself.rules라는 새 파일을 만들었습니다.

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

하지만 USB 드라이브를 컴퓨터에 연결하면 메시지 상자가 표시되지 않습니다. 오류는 어디에 있습니까? 어떻게 디버깅할 수 있나요?

나는 또한 명령을 불렀다

udevadm control --reload-rules

규칙을 다음으로 변경해 보았습니다.

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

아니면 규칙에 따라

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

스크립트를 다음으로 변경하면

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

그러면 이 스크립트가 작동할 것입니다.

답변1

코드가 루트 또는 udev 사용자로 실행되고 있고 해당 사용자에게는 창 관리자와 채팅하고 Tk 창 등을 만들 수 있는 권한이 없는 것 같습니다. 로그 항목을 작성하는 udev 스크립트, 창 관리자 환경의 다른 쪽 끝이 메시지를 읽고 적절한 조치를 취할 수 있는 소켓에 메시지를 보내는 등 일부 형태의 통신이 도움이 될 수 있습니다.

답변2

대화형 셸에서 스크립트를 실행하면 DISPLAY연결 권한이 있는 서버를 나타내는 환경 변수가 있습니다.

실행 중에는 udev그렇지 않습니다.

udev일반적으로 말하면 X11의 실행에 의존하는 작업을 원하지 않으며 이러한 방식으로 공격 표면을 늘리는 것도 원하지 않습니다.

당신은 구독/알림 시스템을 찾고 있는 것 같습니다. 따라서 X 세션을 사용하여 (자신의 것과 같은) 리스너를 시작하고 거기에서 알리미를 실행하도록 할 수 있습니다 udev. 이를 위해 DBus 또는 UDisk를 조사할 수도 있습니다. 또는 inotifywait장치 파일 생성을 모니터링하고 해당 이벤트를 스크립트에서 읽을 수도 있습니다(다시 말하지만 모두 루트가 아닌 사용자로).

관련 정보