У меня есть скрипт, настроенный на запуск при вставке определенного usb-накопителя. Он должен копировать папку с usb-накопителя в резервную папку и перезаписывать эту папку, если она уже существует. Однако, когда я вставляю свой usb-накопитель, он создает папку, но не копирует никаких файлов.
Мой .rules выглядит так:
ACTION=="add", ATTR{idVendor}==Vendor, ATTR{idProduct}==Product, RUN+="/bin/sh /path/to/file/mkBackup"
Мой файл mkBackup выглядит так:
#!/bin/bash
a="/path/to/file/Backup"
if [ -e $a ]; then
rm -rf $a
fi
mkdir $a
cp -r /path/to/usb/folder $a
Когда он запускается udev
, создается папка Backup, но она пуста, но когда я просто запускаю ./mkBackup
, папка создается и все копируется. Это мой первый опыт использования udev
для чего-то подобного, поэтому, пожалуйста, простите меня, если это покажется простым вопросом. Заранее спасибо.
решение1
Учитывая, что папка Backup создана, вы знаете, что скрипт успешно выполняется при подключении устройства. Я подозреваю, что скрипт выполняетсядоустройство фактически завершает монтирование. Таким образом, файлы пока недоступны для cp
.
Что произойдет, если вы добавите sleep 5
после mkdir $a
? Или что, если вы попытаетесь скопировать существующие файлы?
Эта ссылкатакже весьма полезно в качестве справочного материала.
Я также использую:
udevadm monitor --udev
Для просмотра событий udev в реальном времени.
udevadm test /path/to/dev
Для имитации события udev, запущенного для устройства. Обратите внимание, что это ненетзапустить любую программу, указанную клавишей RUN.
РЕДАКТИРОВАТЬ:Как любезно замечает Жиль, моя идея не сработает. И я не знаю решения. Вот почему:
Udev сделает USB-устройство доступным для ОС. Затем ОС поймет, что ОС содержит монтируемую файловую систему, и смонтирует ее. В этот момент файлы на USB-устройстве фактически доступны.
Любой скрипт, запущенный правилом udev, будет выполнендофайловая система фактически смонтирована. Если я придумаю альтернативу, я обновлю пост.