web-dev-qa-db-ja.com

udevルールから起動されたスクリプトは端末に表示されませんか?

Rsyncを実行するスクリプトを作成し、最後にread lineを追加して、実行後に出力が表示されるようにしました。これは、スクリプトを手動で実行したときに意図したとおりに機能します。

上記のスクリプトを実行するためにudevルールRUN+="/home/user/bin/scriptfile"を作成しましたが、スクリプトは意図したとおりに実行されますが、出力はターミナルウィンドウに表示されません。なぜそうではなく、どうすればそうすることができますか?

編集-明確にするために、私はudevルールからさまざまな異なるスクリプトを開始しようとしましたが、うまく動作し、スクリプトが実行され、期待どおりに動作します。問題は、スクリプトの実行時に出力を自分の画面に印刷できるかどうかです。出力をログファイルに送ることもできますが、これも機能しますが、スクリプトの実行中に画面に表示できるようにしたいと思います。

4
kurja

まず、出力が表示されないのはなぜですか?コメントでSergiy Kolodyazhnyyが指摘したように、udevによって開始されたスクリプトは、「同じ環境変数をすべて継承しない。つまり、実行しているGUIセッションと場所を知る方法がない」。簡単に言えば、udevはデスクトップGUIに関しては無知です。

私は現在、私のシステムに接続されているUSBデバイスを求めているのと似たようなことをしています。実行中のアプリケーションの場合、USBに有効なシリアル番号があるかどうかを知る必要があります。とにかく、ここに私がそれを実現した方法があります。

概要:

  • 名前付きパイプを作成し、その名前付きパイプを経由して移動する「メッセージ」を監視するヘルパースクリプトを開始します。
  • 名前付きパイプに「メッセージを送信」する(行を書き込む)ようにudevを構成しました(私の場合はUSB snとパーティション情報)。
  • ヘルパースクリプトは各テキスト行が入っているのを確認し、notify-sendを使用して通知の形式で画面にメッセージをダンプします。

ターミナルウィンドウで表示するだけの場合、ヘルパースクリプトに、ターミナルウィンドウの名前付きパイプからテキストをエコーするように指示できます。


サンプルコード:

#!/bin/bash
#This script should be called once without an argument to get it running in a "service" mode
#Successive calls to this script by UDEV sould pass a string as the first argument.
#   These strings will then be displayed in the window running in service mode.

pipe=/tmp/messages

if [ "$1" == "" ]; then

    [ ! -e  "$pipe" ] && mkfifo "$pipe"

    while true # this loop continuously reads new lines and echos them
    do
        line=$(cat "$pipe")
        echo "$line"
    done
fi

# you won't reach this line unless you call this script with one argument
echo "$1" >> "$pipe"

このスクリプトの実行:

  • 上記をファイルに保存します/tmp/sample_script.sh(再起動時に削除されます)
  • スクリプトを実行可能にするchmod +x /tmp/sample_script.sh
  • スクリプトを呼び出して、サービスモードで実行します(つまり、引数なし)/tmp/sample_script.sh
  • 別の端末ウィンドウ/スクリプト/ udevから、/tmp/sample_script.sh "message to send"を実行します(ここでは、文字列引数「送信するメッセージ」を渡していることに注意してください)。
  • サービスウィンドウを振り返ると、「送信するメッセージ」という文字列がウィンドウに表示されていることがわかります。

Udevからスクリプトを実行するとき、udevスクリプトはGUIの環境とは完全に分離された環境から呼び出されるため、名前付きパイプを介してリダイレクトせずに、2番目のインスタンスから画面に何かを直接出力することはできません。スクリプトで作成され、両方の環境で使用される名前付きパイプは、2つの間のブリッジのように機能し、udev環境から表示しているGUI環境に情報を渡すことができます。

5
b_laoshi