我编写了一个 udev 规则,用于自动将文件从 USB 密钥复制到我的计算机。
ACTION=="add",KERNEL=="sd[d-z][1-9]",ATTRS{serial}=="0701278A8DAE6B42",RUN+="/home/marco/Documents/MesScripts/essai_udev.sh"
我的脚本是:
#!/bin/sh
exec /bin/cp /media/marco/EMTEC/2nde_2023_2024/DS1/DS1.pdf /home/marco/Documents/Travail/Malherbe/2nde/Malherbe_2023_2024/DS/DS1/
其中 EMTEC 是我的 USB 密钥。我也尝试只写“cp”或“/bin/cp”,但没有任何效果。如果我改变这个命令
echo "Hello!" > toto.txt *
有用 !有人可以帮助我吗?
答案1
udev
适用于设置设备供以后使用(由系统的其他部分)的简单任务,而不是实际使用设备的任务。此类复杂的任务最好由侦听 udev 事件的外部应用程序来完成,例如乌迪克斯德(坐骑),网络管理器(网络)等
来自udev 联机帮助页:
RUN{type}
(...) 只能用于运行时间非常短的前台任务。长时间运行事件进程可能会阻止该设备或从属设备的所有进一步事件。请注意,运行的程序访问网络或 udev 规则内不允许挂载/卸载文件系统,由于 systemd-udevd.service 上强制执行的默认沙箱。
不允许启动守护进程或其他长时间运行的进程;分叉的进程,无论是否分离,都将在事件处理完成后被无条件终止。为了从 udev 规则激活长时间运行的进程,请提供一个服务单元并使用 SYSTEMD_WANTS 设备属性从 udev 设备中将其拉入。看 系统设备(5)了解详情。
我强调的意思是,执行规则时永远不会安装文件系统,这就是命令cp
失败的原因。
如果您打算绕过系统的自动挂载并自行挂载您的设备,请参阅那个答案。
我个人会让我的系统像往常一样自动挂载设备,并监听一些事件以触发cp
。根据您的系统和您的口味,这可能是D总线事件,或使用inotify捕捉 FS 事件。