特定のUSBデバイスがマウントされているときにスクリプトを実行する方法はありますか?
ビデオを別のUSBに保存し、USBデバイスのビデオフォルダーをホームフォルダーのビデオフォルダーにマウントするスクリプトを実行したいと思います。
systemdを使用したより良い解決策があります。メディアに依存し、希望するサービスを作成します。例:/etc/systemd/system/your.service
[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount
[Service]
ExecStart=/home/you/bin/triggerScript.sh
[Install]
WantedBy=media-YourMediaLabel.mount
次に、サービスを開始/有効化する必要があります。Sudo systemctl start your.service
Sudo systemctl enable your.service
マウントした後、systemdはトリガースクリプトを起動します。 udevルールに対する利点は、システムデバイスの追加後ではなく、マウント後にスクリプトが実際に起動することです。
ユースケース:自動的にバックアップしたい暗号化されたパーティションがあります。デバイスを追加した後、パスワードを入力する必要があります。バックアップスクリプトをudevにフックすると、スクリプトはパスワードを入力しているときに実行しようとしますが、失敗します。
リソース: devを使用したスクリプト
注:次のコマンドでデバイスユニットを見つけることができます:Sudo systemctl list-units -t mount
lsusb
でデバイスを見つけることから始めます。 IDに注意してください(例0a81:0101
)
/etc/udev/rules.d/
を介してsudoedit /etc/udev/rules.d/100-mount-videos.rules
に新しいudevルールファイルを作成し、そこに新しいルールを次のように追加します。
ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"
lsusb
のIDをどのように使用したかに注意してください。
次に、作業を行うためのスクリプトを作成するだけです。簡単なマウントコマンドが機能するはずです。ファイルシステムの初期化を待つためにsleep 5
コマンドが必要になる場合があります(gnomeからメインのマウントを行う場合は、最初にマウントしてからスリープする必要がない場合があります)。
Allanからの追加:長時間実行されるスクリプトは、「このデバイスまたは依存デバイスのすべてのイベント」をブロックする場合があります。 Mintのマニュアルページには、「長時間実行されているタスクは、イベントプロセス自体から直ちに切り離す必要があります」とさらに記載されています。これを行うためのスキルを得るためのヒントは提供されていません。
オリからの返信:次のようにラップします: https://askubuntu.com/a/106359/449
ATTRS {idVendor}およびATTRS {idProduct}(Ubuntu 12.04でテスト済み)の値を取得する別の方法は次のとおりです。
USBがマウントされている場所を見つけます。
$ mount | grep /dev/sd*
これは次のようなものを示します。
/dev/sdb on /media/SOMEDIR type vfat ...
Udevadmを使用して、そのデバイス情報を取得します。
udevadm info -q all -n /dev/sdb | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*'
出力は次のようになります。
E: ID_MODEL_ID=001a
E: ID_VENDOR_ID=002b
ATTRS {idProduct}のモデルIDとATTRS {idVendor}のベンダーIDを使用します
ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
ファイルマネージャー(nautilus、konquerer、gnomeなど)によるデバイスのマウントおよびアンマウントの制御を妨げたくない場合は、udevルートを使用しないことをお勧めします。
代わりに、システムがudiskを使用している場合(ほとんどすべての場合) disks-glue を使用します。
インストール後、次のようにホームディレクトリに~/.udisks-glue.conf
構成ファイルを作成するだけです。
次の例では、SDカードを接続するたびにカメラのGPS-Assistデータを更新します。
filter BT16EXTREME {
optical = false
partition_table = false
usage = filesystem
label = BT16EXTREME
}
match BT16EXTREME {
post_mount_command = "/home/bernhard/update-gps-assist-data.pl %mount_point"
}
その後、ブートまたはログイン時にudisks-glueが起動することを確認してください。つまりgnomeのスタートアップアプリケーション経由
Nautilusの[編集]> [設定]> [メディア]で、[costumコマンド]よりも[他のアクション]を選択できます。異なる種類のメディアを実行するため。その時までに、USBドライブは既にマウントされていますが、ドライブを表示したいフォルダーに(costumコマンドを使用して)リンクすることができると思います。これがudevを使用するよりも簡単か優れているかわかりません。
@sumidの答えには問題があります。 notサービスを開始する必要があります。有効にする必要があります。
ファイル:/etc/systemd/system/your.service
[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount
[Service]
ExecStart=/any_path_even_inside_the_mount_point/script.sh
[Install]
WantedBy=media-YourMediaLabel.mount
次に、サービスを有効にします。
Sudo systemctl enable your.service
それで全部です。
注:中間ラベルはSudo systemctl list-units -t mount
で見つけることができます
注2:サービスが何らかの理由で失敗した場合(たとえば、スクリプトが実行可能でない場合)、次回usbデバイスをマウントすると、マウントポイントは<old_mount_point_name>1
に変更されます。この問題を修正するには、Sudo systemctl reset-failed
を実行するだけです