Существует гораздо более приятное решение с 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
[117 ] sudo systemctl enable your.service
После того, как mount systemd запустит ваш триггерный скрипт. Преимущество перед правилом udev заключается в том, что скрипт действительно запускается после монтирования, а не после добавления системного устройства.
Вариант использования : у меня есть зашифрованный раздел, который я хочу сделать резервную копию автоматически. После добавления устройства я должен ввести пароль. Если я подключил скрипт резервного копирования к udev, он попытается запустить его в тот момент, когда я набираю пароль, что не получится.
Ресурс: Сценарии с udev
Примечание: Вы можете найти свой блок устройства с: sudo systemctl list-units -t mount
Другой способ получить значения для ATTRS {idVendor} и ATTRS {idProduct} (протестировано в Ubuntu 12.04):
Найдите, где смонтирован ваш usb:
[ 110]это показывает что-то вроде следующего:
/dev/sdb on /media/SOMEDIR type vfat ...
Используйте 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
Теперь используйте идентификатор модели для ATTRS {idProduct} и идентификатор поставщика для ATTRS {idVendor}
ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
У ответа @ 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
Начните с поиска вашего устройства в 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 для основного монтирования - но вы можете сначала смонтировать его, а затем вам может не потребоваться режим сна). [1111 ]
Дополнение от Аллана: Долгосрочные сценарии могут блокировать «все дальнейшие события для этого или зависимого устройства». Моя страница руководства Mint также утверждает: «Долгосрочные задачи должны быть немедленно отсоединены от самого процесса события». Не дается совет о том, где получить навык, чтобы сделать это.
Ответ от Оли: Оберните это так: https://askubuntu.com/a/106359/449
Если вы не хотите вмешиваться в контроль файлового менеджера (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
В «Наутилусе» в меню «Редактирование»> «Установки»> «Мультимедиа» вы можете выбрать «другое действие», а не «команду costum». для различных видов средств массовой информации, которые будут выполнены. К тому времени USB-накопитель уже смонтирован, но я полагаю, что вы все равно можете связать его (с помощью команды costum) с папкой, в которой вы хотите, чтобы накопитель появился. Я не мог сказать, проще ли это или лучше, чем использовать udev.