Belirli bir flash sürücü takıldığında komut dosyası nasıl çalıştırılır?


46

Belirli bir USB cihazı monte edildiğinde bir betiği çalıştırmanın bir yolu var mı?

Videolarımı ayrı bir USB'de tutuyorum ve USB cihazındaki video klasörünü ana klasördeki klasöre bağlayacak bir komut dosyası çalıştırmak istiyorum.

Yanıtlar:


31

Şimdi systemd ile çok daha güzel bir çözüm var . Medyaya bağlı ve istediğiniz bir hizmeti yaratırsınız, örneğin:/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

O zaman servisi başlatmanız / etkinleştirmeniz gerekir:
sudo systemctl start your.service
sudo systemctl enable your.service

Bağlandıktan sonra, systemd tetikleyici komut dosyanızı çalıştırır. Uudev kuralına göre avantaj, komut dosyasının sistem aygıtını ekledikten sonra değil, montajdan sonra gerçekten ateşlenmesidir.

Kullanım örneği : Otomatik olarak yedeklemek istediğim şifreli bir bölümüm var. Cihazı ekledikten sonra şifreyi girmem gerekiyor. Eğer yedekleme betiğini udev'e bağlarsam, betiği şifre yazarken o anda çalışmayı dener, bu başarısız olur.

Kaynak: udev ile komut dosyası oluşturma

Not: Cihazınızı aşağıdakilerle bulabilirsiniz:systemctl list-units -t mount


Umarım Nisan 2016 yakında gelir. Bir sonraki Ubuntu LTS sistemi etkin olacak. AFAIK, yukarıdaki güzel çözümün Ubuntu 15.04 veya daha yenisini gerektiriyor.
guettli

Oh, sistemin zaten ubuntu'da olduğunu sanıyordum. Aslında debian stretch ;-) kullanıyorum
sumid

@sumid ~ / .config / systemd altına koymak istersem işe yarar mı?
Khurshid Alam

4
Harika! Debian Jessie'de test edildi. Hizmetinizi etkinleştirmeyi unutmayın systemctl enable your.service. Komut dosyası çalıştırılabilir olmalıdır.
Corni,

1
Benim için bu başarısız. Hizmeti başlatmaya çalıştığımda, "Birim media-bb.mount bulunamadı" ile şikayet ediyor. Tuhaf bir karakter olmadığından ve çok uzun olmadığından veya bunun gibi bir şey olmadığından emin olmak için parmak sürücümün (FAT32) FS "bb" adını verdim. Denedim Requires=, After=ve WantedBy=hem çizgiler media-bb.mountve media-BB.mountNautilus beni gösterileri "BB" değil "bb" olarak hacim çünkü. Büyük / küçük harf dışında aynı hata mesajı. Sorun nedir? Bir şekilde bu media-<something>.mountservisi yaratmam gerekir mi?
UTF-8

29

Cihazınızı bularak başlayın lsusb. Kimliği not edin (örn. 0a81:0101)

/etc/udev/rules.d/Üzerinden yeni bir udev kural dosyası oluşturun sudoedit /etc/udev/rules.d/100-mount-videos.rulesve burada şöyle yeni bir kural yazın:

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

Kimliği nasıl kullandığımı not edin lsusb.

O zaman sadece işi yapmak için senaryoyu yazmanız gerekir. Basit bir mount komutu işe yaramalı. sleep 5Dosya sisteminin başlatılmasını beklemek için bir komuta ihtiyacınız olabilir (ana montalamayı yapmak için cüceyi bırakırsanız - ancak önce monte etmekte özgürsünüz, sonra uykuya ihtiyacınız olmayabilir).

Allan'dan İlave: Uzun süre çalışan komut dosyaları "bu veya bağımlı bir cihaz için tüm diğer etkinlikleri" engelleyebilir. Nane adam sayfam, "Uzun süren görevlerin olay sürecinden derhal ayrılması gerektiğini" belirtiyor. Bunu yapabilme yeteneğinin nereden kazanılacağı konusunda ipucu verilmez.

Oli kullanıcısının yanıtı: Öyle sarın: https://askubuntu.com/a/106359/449


4
"RUN" komutunun "su your_user -c" ile ön eklemesini önerebilirim, böylece komut dosyası root yetkileriyle çalışmıyor.
Kees Cook,

3
@Kees Buradaki amaç bir araya gelerek, kök ayrıcalıklarını korumak iyi bir fikir olabilir. Belki de senaryoyu kullanıcının evinde tutmak yerine, onu /root/yalnızca kökün düzenleyebileceği bir yerde saklarsınız .
Oli

2
Bu soruya cevap vermiyor. Sorusu USB sürücü olduğunda bir komut dosyası çalıştırma sorar monte . Bu cevap, takılı olduğunda bir USB sürücü bağlayan bir komut dosyasının nasıl çalıştırılacağını açıklar . Fark benim için önemli çünkü böyle bir senaryo var (dijital kamera için); komut dosyası olmadan, sürücü takılabilir veya takılabilir (kullanıcı ayarlarına bağlı olarak) ve sürücü takılıyken bir şey yapmak istediğimde monte edilir (görüntüleri kopyalar). Böylece betiğim (sürücü eklendiğinde çalışır) sıklıkla yanlış zamanda çalışıyor.
Reinier Post


Bu, elde etmenin inanılmaz derecede spesifik (kırılgan) bir yoludur. @sumid cevap modern
distro

8

ATTRS {idVendor} ve ATTRS {idProduct} (Ubuntu 12.04'te test edilmiştir) için değerleri almanın başka bir yolu:

  1. USB'nizin nereye monte edildiğini bulun:

    $ mount | grep /dev/sd*
    

    Bu, aşağıdaki gibi bir şey gösterir:

    /dev/sdb on /media/SOMEDIR type vfat ...
    
  2. Bu cihaz bilgisini almak için udevadm kullanın:

    udevadm info -q all -n /dev/sdb | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*'
    

    çıktı şöyle bir şey olmalı:

    E: ID_MODEL_ID=001a
    E: ID_VENDOR_ID=002b
    
  3. Şimdi ATTRS {idProduct} için model kimliğini ve ATTRS {idVendor} için satıcı kimliğini kullanın

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

1

Nautilus'ta Düzenle> Tercihler> Medya altında "diğer eylem" i ve "kostüm komutu" nu seçebilirsiniz. farklı medya türleri için yürütülecek. O zamana kadar usb sürücü zaten monte edilmiş, ama sanırım hala sürücünün görünmesini istediğiniz klasöre (bir costum komutu ile) bağlayabilirsiniz. Bunun bunun udev kullanmaktan daha kolay veya daha iyi olup olmadığını söyleyemedim.


Komut kostüm giyer mi? ya da bir kostüm?
erjoalgo

1

Cihaz yöneticinize (nautilus, konquerer, gnome, vb.) Cihazınızın montajı ve sökülmesi üzerindeki kontrolünü engellemek istemezseniz, udev yoluna gitmemenizi öneririm.

Bunun yerine, sisteminiz udisks kullanıyorsa udisks-tutkal kullanın (neredeyse hepsi yapar).

Kurduktan sonra, ~/.udisks-glue.confana dizininizde böyle bir yapılandırma dosyası oluşturun .

Aşağıdaki örneğim, SD kartı her taktığımda, kameramdaki GPS Yardımı verilerini güncelliyor.

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

Sonra udisks tutkalı başlattığınızda veya oturum açtığınızda başladığınızdan emin olun. Gnome'un başlangıç ​​uygulamaları aracılığıyla


1
Udev2 :-( desteklemiyor
sumid


0

@ sumid'in cevabının bir sorunu var. Sen gerektiğini değil hizmetini başlatın. Sadece etkinleştirmen gerekiyor.

dosya: /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

Ardından hizmeti etkinleştirin:

sudo systemctl enable your.service

Bu kadar.

Not: Medial etiketinizi aşağıdakilerle bulabilirsiniz:sudo systemctl list-units -t mount

Not2: Hizmet bir şekilde başarısız olursa (örneğin, komut dosyası çalıştırılamaz), bağlantı noktanız <old_mount_point_name>1usb aygıtını bir sonraki takışınızda değişir . Bu sorunu çözmek için, sadece yürütmeniz gerekirsudo systemctl reset-failed

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.