Как запустить скрипт при монтировании конкретной флешки?

Есть ли способ запустить скрипт при подключении определенного USB-устройства?

Я храню свои видео на отдельном USB и хотел бы запустить скрипт, который бы монтировал папку видео на устройстве USB в папку в домашней папке.

7 ответов

Теперь с 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

Примечание. Устройство можно найти с помощью: sudo systemctl list-units -t mount

Начните с поиска вашего устройства в lsusb, Запишите идентификатор (например, 0a81:0101)

Создайте новый файл правил udev в /etc/udev/rules.d/ через 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 для основного монтирования - но вы можете сначала смонтировать его, а затем вам может не понадобиться сон).

Дополнение от Аллана: Долгосрочные сценарии могут блокировать "все дальнейшие события для этого или зависимого устройства". Моя страница руководства Mint также утверждает: "Долгосрочные задачи должны быть немедленно отсоединены от самого процесса события". Нет подсказок о том, где можно приобрести навык для этого.

Ответ от Оли: Оберните это так: /questions/705490/zapusk-programm-v-fonovom-rezhime-iz-terminala/705506#705506

Другой способ получить значения для 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" ...
    

В Nautilus под Edit>Preferences>Media вы можете выбрать "другое действие", а не "costum command". для различных видов средств массовой информации, которые будут выполнены. К тому времени USB-накопитель уже смонтирован, но я полагаю, что вы все равно можете связать его (с помощью команды costum) с папкой, в которой вы хотите, чтобы накопитель появился. Я не мог сказать, проще ли это или лучше, чем использовать udev.

Ответ @ 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

Если вы не хотите вмешиваться в контроль вашего файлового менеджера (nautilus, konquerer, gnome и т. Д.) За монтированием и размонтированием вашего устройства, я советую не идти по пути udev.

Вместо этого используйте udisks-glue, если ваша система использует udisks (почти все так делают).

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

Мой следующий пример обновляет данные GPS-Assist на моей камере каждый раз, когда я подключаю 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"
}

После этого убедитесь, что udisks-glue запускается при загрузке или входе в систему. Т.е. через приложения запуска gnome

Другие вопросы по тегам