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

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

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

54
задан 8 April 2014 в 05:27

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

Примечание: Вы можете найти устройство с:

systemctl list-units -t mount
40
ответ дан 8 April 2014 в 05:27

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

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

Ответ от Оли: Оберните его так: https://askubuntu.com/a/106359/449

31
ответ дан 8 April 2014 в 05:27

Другой способ получить значения для ATTRS{idVendor} и ATTRS{idProduct}. (тестировался в Убунту 12.04) есть:

  1. Узнайте, где установлен ваш USB:

     $ монтировать | grep /dev/sd*.
    

    это показывает что-то вроде следующего:

    /dev/sdb на /media/SOMEDIR типа 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" ...
    
8
ответ дан 8 April 2014 в 05:27
0
ответ дан 8 April 2014 в 05:27

Ответ @ 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: Если служба каким-то образом не работает (например, сценарий не выполняется ), ваша точка монтирования изменится на 1 в следующий раз, когда вы подключите USB-устройство. Чтобы решить эту проблему, вам просто нужно выполнить sudo systemctl reset-failed

0
ответ дан 8 April 2014 в 05:27

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

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

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

Мой следующий пример обновляет данные GPS-Assist на моей камере каждый раз, когда я подключаю SD- card.

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
ответ дан 8 April 2014 в 05:27

В Nautilus в меню «Правка»> «Настройки»> «Мультимедиа» вы можете выбрать «другое действие», а не «настраиваемую команду» для выполнения различных сценариев / команд. К тому времени USB-накопитель уже смонтирован, но я полагаю, вы все еще можете связать его (с помощью специальной команды) с папкой, в которой должен отображаться диск. Я не мог сказать, легче это или лучше, чем использовать udev.

1
ответ дан 8 April 2014 в 05:27

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

Похожие вопросы: