插入设备时触发文件复制(不依赖于 systemd)

插入设备时触发文件复制(不依赖于 systemd)

我希望在插入存储设备时自动复制其中的一些文件。我希望在使用 systemd 的系统和使用 init 脚本的系统(例如 Gentoo 上的 OpenRC)上使用同一种方法。此外,我还希望不破坏自动挂载。

我从许多其他处理此问题的问题中了解到,最好通过 udev 来完成此操作,并且它几乎可以工作,如果不是因为 udev posthook 在自动挂载之前严格执行(以 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

添加 sleep 并将脚本执行转移到子 shell 似乎不起作用。该文件无法访问,因为现在自动挂载已被完全禁止:

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

仅使用 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

相关内容