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

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

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

chymera@quiethost ~/.repositorg/transfer $ cat /etc/udev/rules.d/95-local.rules 
ACTION=="add", KERNEL=="sd?1", ENV{ID_FS_UUID}=="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{ID_FS_UUID}=="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/

1 ответ1

1

Это невозможно (разумно) реализовать только с помощью 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .