udev ルールに従って X ウィンドウを表示するスクリプトの実行

udev ルールに従って X ウィンドウを表示するスクリプトの実行

いくつかの問題を発見しましたhttp://unix.stackexchange.com&存在するhttp://stackoverflow.comudevルールの起動スクリプトに関連しています。ただし、実行する正確な解決策や具体的な答えが見つかりません。吹くスクリプト。

だから私は次のような(標準的な)質問をします。udevルールを介してBashスクリプトを実行/開始/実行する方法は?

また発見した事実udevルールの作成例:

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

だから「走り方」が可能かどうか気になりました。バッシュスクリプト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)が接続されている間に実験的なコマンドを実行したいと思います。

だから私は/home/pandya/example.sh(udevルールで呼び出されるRUN+=)contiansを書いた:

#!/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ルールを介してBashスクリプトを実行するには? もし欠けているものがあればご提案ください。

答え1

ほとんどの場合、コマンドは実行中ですが、出力を表示する場所はわかりません。私は、root以外のユーザーを使用してXにログインしていて、ルールがrootとして実行される可能性が高いと仮定します。次のコマンドを試してください。

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

実行のためバッシュスクリプト次のコマンドに従ってください。

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}:現在ttyユーザーが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!"'

関連情報