Як запустити сценарій, коли встановлено певну флешку?


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 року. Наступний Ubuntu LTS буде активовано системою. AFAIK для приємного рішення зверху потребує Ubuntu 15.04 або новішої версії.
guettli

О, я думав, що systemd вже є в ubuntu. Я фактично працюю з розтяжкою debian ;-)
ввечері

@sumid Якщо я хочу поставити його під ~ / .config / systemd, це буде працювати?
Хуршид Алам

4
Чудово! Випробуваний у Дебіана Джессі. Не забудьте включити вашу послугу systemctl enable your.service. Файл сценарію повинен бути виконаним.
Корні

1
Для мене це не вдається. Коли я намагаюся запустити послугу, вона скаржиться на "Unit media-bb.mount not found.". Я закликав FS-накопичувача (FAT32) "bb", щоб переконатися, що в ньому немає дивних символів, і це не надто довго або щось подібне. Я спробував Requires=, After=і WantedBy=лінії як з media-bb.mountі media-BB.mountтому Nautilus показує мені обсяг , як «BB», а не "ББ». Те саме повідомлення про помилку, за винятком великих літер. Що не так? Чи потрібно якось створити цю media-<something>.mountслужбу?
UTF-8

29

Почніть з пошуку свого пристрою в lsusb. Зверніть увагу на ідентифікатор (наприклад 0a81:0101)

Створіть новий файл правил udev /etc/udev/rules.d/через via 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"

Зверніть увагу, як я використовував ідентифікатор lsusb.

Тоді вам просто потрібно написати сценарій, щоб виконати роботу. Проста команда кріплення повинна працювати. Можливо, вам знадобиться sleep 5команда там, щоб зачекати ініціалізації файлової системи (якщо ви залишите gnome виконати основне монтування - але ви спочатку зможете її встановити, і тоді вам може не знадобитися сон).

Додавання від Allan: Тривалі сценарії можуть блокувати "всі подальші події для цього або залежного пристрою". На моїй сторінці "Моя чеканка" далі зазначено: "Тривалі завдання потрібно негайно відірвати від самого процесу події". Не дається підказок щодо того, де набути навичок цього робити.

Відповідь від Олі: Загорніть так: https://askubuntu.com/a/106359/449


4
Я можу запропонувати префіксувати команду "RUN" за допомогою "su your_user -c", щоб сценарій не працював з привілеями root.
Кіс Кук

3
@Kees Оскільки тут є мета, збереження кореневих приватних файлів може бути хорошою ідеєю. Можливо, замість того, щоб зберігати скрипт у домі користувача, ви зберігаєте його /root/чи десь там, де лише root може редагувати його.
Олі

2
Це не відповідає на запитання. Питання запитує , як запустити сценарій , коли диск USB буде встановлено . Ця відповідь говорить про те, як запустити скрипт, який встановлює USB-накопичувач, коли він вставлений . Для мене важлива різниця, оскільки у мене є такий сценарій (для цифрової камери); без сценарію диск може бути встановлений або може бути встановлений на вставці (залежно від налаштувань користувача), і лише тоді, коли диск встановлений, я хочу щось зробити (скопіювати зображення). Тож мій сценарій (який працює при додаванні диска) часто працює в неправильний час.
Reinier Post


це неймовірно специфічний (крихкий) спосіб досягти. @sumid відповідь більш застосовна для використання сучасних дистрибутивів 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} та ідентифікатора постачальника для ATTRS {idVendor}

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

1

У Nautilus у розділі Правка> Налаштування> Медіа ви можете обрати "іншу дію" та "команду костюму". для різних типів засобів масової інформації, які мають виконуватися. До цього часу USB-накопичувач вже змонтований, але, мабуть, ви все-таки можете пов’язати його (з командою costum) до папки, в якій ви хочете відобразити диск. Я не міг сказати, чи це простіше чи краще, ніж використовувати udev.


команда одягає костюм? чи костюм?
erjoalgo

1

Якщо ви не хочете перешкоджати контролю ваших файлових менеджерів (nautilus, konquerer, gnome тощо) над встановленням та демонтажем пристрою, я пропоную не їхати по маршруту udev.

Натомість використовуйте udisks-клей, якщо ваша система використовує udisks (майже всі).

Після встановлення просто створіть конфігураційний файл ~/.udisks-glue.confу вашому домашньому каталозі, як це.

Мій наступний приклад оновлює дані GPS-допомоги на моїй камері щоразу, коли я підключаю SD-карту.

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

Після цього просто переконайтеся, що удиск-клей починається під час завантаження або входу в систему. Тобто через програми запуску 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>1наступного разу, коли ви змонтуєте пристрій usb. Щоб виправити цю проблему, потрібно просто виконатиsudo systemctl reset-failed

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.