Я пытаюсь записать несколько файлов на USB при подключении его в Linux.
На самом деле, у меня есть файл /etc/udev/rules.d/
с:
ACTION=="add", ENV{ID_FS_UUID}=="9FE8-99G3", RUN+="/usr/bin/sudo -u myuser /home/myuser/Scripts/mycrazy.sh"
В mycrazy.sh
, у меня есть:
## Path to mounted device
PATH_USB=/run/media/myuser/9FE8-99G3
mkdir $PATH_USB/some_folder
mkdir /home/myuser/Documents/another_folder
Первый mkdir не работает. А второй работает.
Как мне записать файлы на usb? Что-то не хватает в моем скрипте?
решение1
Что работает для меня, так это добавление задержки (
sleep
) иdisown
скрипта, в котором есть задержка, с использованием промежуточного скрипта.RUN{
type
}
... This can only be used for very short-running foreground tasks. Running an event process for a long period of time may block all further events for this or a dependent device. Starting daemons or other long running processes is not appropriate for udev; the forked processes, detached or not, will be unconditionally killed after the event handling has finished.
источник:
man udev
Похожий случай есть и здесь:Почему мои правила udev запускаются, если я использую триггер udevadm, но НЕ во время загрузки?.Ответ ФеамартоКажется, это лучше моего решения. Он ждет, пока его файловая система не будет готова в
rw
режиме. Можете попробовать.Поскольку это USB-накопитель, его можно извлечь перед монтированием. Скрипт останется активным до следующей перезагрузки или его снова подключат (что вызовет другой экземпляр) и смонтируют.
Один из способов исправить это — проверять
/dev/sdxY
, существует ли еще связанное состояние в каждом цикле.Вот моя установка:
/etc/udev/rules.d/99-sneetsher-tests.rules
ACTION=="add", ENV{ID_FS_UUID}=="6664-B2DA", RUN+="/usr/bin/sudo -u user /home/user/mycrazy.sh"
/home/user/mycrazy.sh
#!/bin/sh /home/user/mycrazy2.sh & disown
/home/user/mycrazy2.sh
#!/bin/sh PATH_USB=/media/user/MYFLASH3 sleep 5 mkdir $PATH_USB/some_folder