Запустить копирование файла после вставки устройства (без зависимости от systemd)

314
TheChymera

Я хотел бы автоматически скопировать некоторые файлы из запоминающего устройства после его вставки. Я рассчитываю использовать один и тот же метод в обеих системах, которые используют systemd, и в системах, использующих сценарии инициализации (например, OpenRC в Gentoo). Кроме того, я бы постарался не нарушать автомонтирование.

Из многих других вопросов, касающихся этой проблемы, я понял, что лучше всего это сделать с помощью udev, и это почти работает, если не выполнять постхук udev, выполняемый строго перед автомонтированием (таким образом, чтобы udev проверял состояние выхода любых сценариев) он вызывал и любые скрипты, которые вызывает скрипт, каким-то процессом, который для меня выглядит волшебством):

Выполнение скрипта работает, только то, что файл не может быть скопирован, потому что (я полагаю) триггер автоподключения ожидает завершения копирования скрипта:

chymera@quiethost ~/.repositorg/transfer $ cat /etc/udev/rules.d/95-local.rules  ACTION=="add", KERNEL=="sd?1", ENV=="4C3D-8BCB", RUN+="/bin/su chymera -c /home/chymera/.repositorg/transfer/4C3D-8BCB.sh" chymera@quiethost ~/.repositorg/transfer $ cat 4C3D-8BCB.sh  #!/usr/bin/env bash  touch ~/lalax.txt cp "/run/media/chymera/NIKON D750/lala.txt" ~/ chymera@quiethost ~/.repositorg/transfer $ ls ~/lal* /home/chymera/lalax.txt chymera@quiethost ~/.repositorg/transfer $ ls /run/media/chymera/NIKON\ D750/ DCIM lala.txt NIKON001.DSC 

Добавление режима сна и переключение выполнения сценария на подоболочку, похоже, не работает. Файл не становится доступным, потому что теперь автомонтирование полностью заблокировано:

chymera@quiethost ~/.repositorg/transfer $ cat /etc/udev/rules.d/95-local.rules  ACTION=="add", KERNEL=="sd?1", ENV=="4C3D-8BCB", RUN+="/bin/su chymera -c /home/chymera/.repositorg/transfer/_4C3D-8BCB.sh" chymera@quiethost ~/.repositorg/transfer $ cat _4C3D-8BCB.sh  #!/usr/bin/env bash  nohup /bin/bash /home/chymera/.repositorg/transfer/4C3D-8BCB.sh & exit chymera@quiethost ~/.repositorg/transfer $ cat 4C3D-8BCB.sh  #!/usr/bin/env bash  touch ~/lalax.txt sleep 5 cp "/run/media/chymera/NIKON D750/lala.txt" ~/ chymera@quiethost ~/.repositorg/transfer $ ls ~/lal* /home/chymera/lalax.txt chymera@quiethost ~/.repositorg/transfer $ ls /run/media/chymera/ 
0

1 ответ на вопрос

1
grawity

Это невозможно (разумно) реализовать только с помощью udev, потому что udev только ретранслирует событие «добавлено устройство» после того, как все правила и все работники закончили на этом устройстве. (И событие - это то, что вызывает автомонтирование, как правило.)

Вместо того, чтобы реагировать на устройства, вы хотите реагировать на новые крепления :

#!/usr/bin/env bash  wanted_dir="/run/media/chymera/NIKON D750"  findmnt -o action,target -r -n --poll | while read -r eaction etarget; do if [[ "$eaction" == mount && "$etarget" == "$wanted_dir" ]]; then cp this that etc. fi done 
Таким образом, я добавляю это как сервис и продолжаю работать вечно? Мне все еще интересно, как udev может отслеживать потерянные процессы, запущенные его рабочими (даже в подоболочках). TheChymera 5 лет назад 0

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