特定のフラッシュドライブが接続されたら、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=add
SysVinit システムで実行し、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ユニットを定義し、スクリプトで必要な依存関係を宣言することです。それでも潜在的な競争状況に注意する必要があります。