udevルールからXウィンドウを表示するスクリプトを実行する

udevルールからXウィンドウを表示するスクリプトを実行する

いくつかの質問を見つけましたhttp://unix.stackexchange.com& の上http://stackoverflow.comudevルールによる起動スクリプトに関連しています。しかし、実行するための正確な解決策や確実な答えを見つけることができませんバッシュ脚本。

そこで、私は(標準的な)質問をします。udev ルールを使用して Bash スクリプトを実行/起動/実行するにはどうすればよいですか?

私が見つけたもう一つのものはudevルールの記述は:

udev は、これらのプログラムをアクティブな端末上で実行せず、シェルのコンテキストで実行しません。プログラムが実行可能としてマークされていることを確認してください。シェル スクリプトの場合は、適切なシェバン (例: #!/bin/sh) で始まっていることを確認してください。また、端末に標準出力が表示されることは想定しないでください。

そこで、できれば「どうやって実行するか」を知りたいのです。bashスクリプトudev ルールでは?


以下は bash スクリプトを実行する簡単な例です。

99-myrule.rules以下を含む内容を書きました/etc/udev/rules.d:

ACTION=="add", ATTR{idVendor}=="0781", ATTR{idProduct}=="5567", RUN+="/home/pandya/example.sh"

lsusb出力からベンダーと製品 ID を見つけました:

$ lsusb | grep SanDisk
Bus 001 Device 066: ID 0781:5567 SanDisk Corp. Cruzer Blade

zenity --infoそして、ペンドライブ(上記にリストされている SanDisk 製)が接続されたときに、実験的なコマンドを実行したいと思います。

そこで、私は( udev ルールで/home/pandya/example.sh呼び出される)contians を記述しました:RUN+=

#!/bin/bash
zenity --info &
exit

しかし、このスクリプトは実行されません (実行権限があるにもかかわらず)。次のことも試しました:

  • export DISPLAY=:0以前のスクリプトではzenity --info
  • bash -c 'DISPLAY=:0 zenity --info

そしてもちろん:

  • sudo restart udev
  • sudo udevadm control --reload-rules

しかし、出力が得られませんzenity --info

したがってudev ルールの menas で Bash スクリプトを実行するにはどうすればよいですか? 何か見落としている点があれば教えてください。

答え1

おそらく、コマンドは実行されていますが、出力をどこに表示するかがわかりません。X に root 以外のユーザーでログインしており、そのルールは root として実行されている可能性が高いと想定しています。次のコマンドを試してください。

su - your_X_user_here -c 'export DISPLAY=:0;zenity --info'

実行するためにBash スクリプト次のコマンドに従います:

su - your_X_user_here -c 'export DISPLAY=:0; bash -c "/path/to/script.sh"'

答え2

最近見つけた優雅な方法DISPLAY を気にせずに udev ルールから GUI または X タスクを表示します。 を使用するシェル スクリプトでも原理は同じですexport

IMPORT{program}="/usr/bin/xpub", \
RUN+="/bin/su $env{XUSER} -c '/usr/bin/notify-send Hello'"

$env{ENV}: 現在の端末ユーザーがXを起動した場合は、それ以外の場合は削除します

答え3

これを読んでいる他の皆さんのために、私が Kali Linux 2016 でスクリプトを動作させる唯一の方法は、次のとおりです。

#!/bin/bash
set -x
xhost local:root
export DISPLAY=:0.0
su root -c 'zenity --notification --text="I am a notification!"'

関連情報