デバイスが接続された状態でコンピュータを起動するときは、USBフラッシュドライブのudevルールを実行します。

デバイスが接続された状態でコンピュータを起動するときは、USBフラッシュドライブのudevルールを実行します。

特定のフラッシュドライブが接続されたら、Ubuntu 15.04 x64サーバーシステムでスクリプトを実行したいと思います。そのため、次の内容でカスタムルールファイルを作成しました。

ACTION=="add",SUBSYSTEM=="usb",ATTR{idVendor}=="my-vendor",ATTR{idProduct}=="my-id",RUN+="/var/scripts/my-script.sh"

フラッシュドライブが接続されるたびにスクリプトが実行されますが、2つの質問があります。

1) ドライブが接続された状態でコンピュータを(再)起動すると、スクリプトが実行されないようです.フラッシュドライブがすでに接続されている場合、起動後にスクリプトを実行する方法はありますか?

2) スクリプトではデバイスをマウントしようとするが、このようにデバイスをマウントしようとすると

mount LABEL=mylabel /some/path

または

mount UUID=my-uuid /some/path

ソースが見つかりません。現在私

sleep 5s

私はスクリプトに追加しましたが、これは信頼できるソリューションではないようです。システムが完全に初期化されるのを待つ(フォールトトレランス)方法はありますか?

テスト目的で、スクリプトには次のものが含まれます。

#!/bin/sh
date >> /tmp/test.log

答え1

addデバイスが存在する場合、システムの起動中にアクションルールが実行されます。これは、udevadm info --action=addSysVinit システムで実行し、Upstart または Systemd システム内で実行することによって実行されます。ただし、これはルートファイルシステムがまだ読み取り専用でマウントされており、ファイルシステムがまだマウントされていない場合に起動プロセスの初期に発生します/etc/fstab/runその時頃なら可能だったかもしれませんね。スクリプトが実行する必要がある操作と比較して、早すぎるステップかもしれません。

/etc/rc.local起動中にスクリプトを実行する迅速で汚れていますが、移植可能な方法は、条件に応じて既存のデバイスでスクリプトを実行することです。

if [ -e /dev/disk/by-id/… ]; then
  /var/scripts/my-script.sh
fi

起動中にデバイスが接続されていると、競合状態が発生する可能性があります。デバイスが検出されるとすぐにスクリプトが実行されます/etc/rc.local

よりきれいな解決策は、systemdユニットを定義し、スクリプトで必要な依存関係を宣言することです。それでも潜在的な競争状況に注意する必要があります。

関連情報