web-dev-qa-db-ja.com

特定のフラッシュドライブがマウントされているときにスクリプトを実行する方法は?

特定のUSBデバイスがマウントされているときにスクリプトを実行する方法はありますか?

ビデオを別のUSBに保存し、USBデバイスのビデオフォルダーをホームフォルダーのビデオフォルダーにマウントするスクリプトを実行したいと思います。

46
user9428

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

31
sumid

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

29
Oli

ATTRS {idVendor}およびATTRS {idProduct}(Ubuntu 12.04でテスト済み)の値を取得する別の方法は次のとおりです。

  1. USBがマウントされている場所を見つけます。

    $ mount | grep /dev/sd*
    

    これは次のようなものを示します。

    /dev/sdb on /media/SOMEDIR type vfat ...
    
  2. 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
    
  3. ATTRS {idProduct}のモデルIDとATTRS {idVendor}のベンダーIDを使用します

    ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
    
8
emont01

ファイルマネージャー(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のスタートアップアプリケーション経由

1
xro

Nautilusの[編集]> [設定]> [メディア]で、[costumコマンド]よりも[他のアクション]を選択できます。異なる種類のメディアを実行するため。その時までに、USBドライブは既にマウントされていますが、ドライブを表示したいフォルダーに(costumコマンドを使用して)リンクすることができると思います。これがudevを使用するよりも簡単か優れているかわかりません。

1
bacon

@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を実行するだけです

0
sgon00
0
user10333