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


46

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

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

回答:


31

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にフックすると、パスワードを入力しているときにスクリプトが実行を試みますが、失敗します。

リソース:udevを使用したスクリプト作成

注:デバイスユニットは次の方法で見つけることができます。systemctl list-units -t mount


2016年4月がもうすぐ来ることを願っています。次のUbuntu LTSではsystemdが有効になります。上記のすばらしいソリューションにはUbuntu 15.04以降が必要です。
ゲットリ

ああ、systemdはすでにubuntuにあると思った。私は実際にdebian stretchを実行しています
;

@sumid〜/ .config / systemdの下に置きたい場合、動作しますか?
ルシッドアラム

4
すばらしいです!Debian Jessieでテスト済み。サービスを有効にすることを忘れないでくださいsystemctl enable your.service。スクリプトファイルは実行可能である必要があります。
コーニ

1
私にとって、これは失敗します。サービスを開始しようとすると、「Unit media-bb.mount not found。」というメッセージが表示されます。サムドライブ(FAT32)FSを「bb」と呼び、奇妙な文字が含まれていないこと、長すぎないこと、またはこのようなことを確認しました。私が試したRequires=After=WantedBy=の両方の行をmedia-bb.mountし、media-BB.mountノーチラス私のショー「BB」ではなく、「BB」などボリュームあるため。大文字化を除いて、同じエラーメッセージ。どうしましたか?どういうわけmedia-<something>.mountかそのサービスを作成する必要がありますか?
UTF-8

29

でデバイスを見つけることから始めますlsusb。IDに注意してください(例0a81:0101

/etc/udev/rules.d/viaで新しいudevルールファイルを作成し、sudoedit /etc/udev/rules.d/100-mount-videos.rulesそこに新しいルールを次のように追加します。

ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"

のIDの使用方法に注意してくださいlsusb

次に、作業を行うためのスクリプトを記述する必要があります。簡単なマウントコマンドが機能するはずです。sleep 5ファイルシステムの初期化を待機するコマンドが必要になる場合があります(gnomeからメインのマウントを行う場合は、最初にマウントしてからスリープする必要がない場合があります)。

アランからの追加:長時間実行されるスクリプトは、「このデバイスまたは依存デバイスのすべてのイベント」をブロックする場合があります。Mintのマニュアルページには、「長時間実行されているタスクは、イベントプロセス自体から直ちに切り離す必要があります」とさらに記載されています。これを行うためのスキルを得るためのヒントは提供されていません。

オリからの返信https : //askubuntu.com/a/106359/449


4
スクリプトがルート権限で実行されないように、「RUN」コマンドの前に「su your_user -c」を付けることをお勧めします。
キーズクック

3
@Keesここでの目的はマウントであるため、root権限を保持することをお勧めします。おそらく、ユーザーの家にスクリプトを保持する代わりに、スクリプトを、/root/またはrootのみが編集できる場所に保持します。
オリ

2
これは質問に答えません。質問は、USBドライブがマウントされたときにスクリプトを実行する方法を尋ねます。この回答は、USBドライブが挿入されたときにUSBドライブをマウントするスクリプトを実行する方法を示しています。このようなスクリプト(デジタルカメラ用)があるため、違いは私にとって重要です。スクリプトなしでは、ドライブは挿入時にマウントされる場合とマウントされる場合があり(ユーザー設定によって異なります)、ドライブをマウントしたときにのみ何かをしたい(イメージをコピーします)。そのため、(ドライブの追加時に実行される)私のスクリプトは、しばしば間違った時間に実行されます。
Reinierポスト


これは、非常に具体的な(脆弱な)達成方法です。systemd
MrMesees

8

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" ...
    

1

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


コマンドは衣装を着ていますか?またはコスチューム?
エルジョアルゴ

1

ファイルマネージャー(nautilus、konquerer、gnomeなど)によるデバイスのマウントおよびアンマウントの制御を妨げたくない場合は、udevルートを使用しないことをお勧めします。

代わりに、システムがudiskを使用する場合は、udisks-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
udev2をサポートしていません:-(
sumid


0

@sumidの答えには問題があります。サービスを開始しないでください。有効にする必要があります。

ファイル: /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:サービスが何らかの理由で失敗した場合(たとえば、スクリプトが実行可能でない場合)、マウントポイントは<old_mount_point_name>1usbデバイスを次回マウントするときに変更されます。この問題を修正するには、実行する必要がありますsudo systemctl reset-failed

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.