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

コードがrootまたはudevユーザーとして実行されており、そのユーザーにはウィンドウマネージャとチャットしてTkウィンドウなどを作成する権限がないようです。ログエントリを作成するudevスクリプト、ウィンドウマネージャ環境のもう一方の端がメッセージを読み、適切なアクションを実行できるソケットにメッセージを送信するなど、一部の種類の通信が役立ちます。

答え2

対話型シェルでスクリプトを実行すると、DISPLAY接続権限を持つサーバーを表す環境変数があります。

実行中はudevそうではありません。

udev一般的に言えば、X11の実行に依存する作業は望ましくなく、この方法で攻撃面を増やすことも望ましくありません。

あなたは購読/通知システムを探しているようです。そのため、Xセッションを使用して(自分のような)リスナーを起動し、そこで通知を実行させることができますudev。これを行うには、DBusまたはUDiskを調べることもできます。あるいは、inotifywaitデバイスファイルの作成を監視し、そのイベントをスクリプトから読み取ることもできます(再度、すべてrootではないユーザーとして)。

関連情報