基本上,我有一个小文件,我想将其备份到各种存储设备上。有什么方法可以让安装新驱动器时自动发生这种情况(无论是启动时的硬盘,还是系统已经运行时的闪存驱动器)?可能不是世界上最有效的事情,但如果我可以插入一个驱动器并获得该文件的另一个副本而无需考虑它,那就太酷了。
答案1
使用RUN+=
是错误的方法。正如man udev
所表明的那样:
这只能用于运行时间非常短的前台任务。长时间运行事件进程可能会阻止该设备或从属设备的所有进一步事件。
启动守护进程或其他长时间运行的进程不适合 udev;分叉的进程,无论是否分离,都将在事件处理完成后被无条件终止。
正确的方法是使用SYSTEMD_WANTS
(来自man systemd.device
):
UDEV 数据库 设备单元的设置可以通过单元文件配置,也可以直接从 udev 数据库配置(推荐)。systemd 可以理解以下 udev 属性:
SYSTEMD_WANTS= 将此单元的 Wants 类型依赖项添加到所有列出的单元。当特定设备可用时,这可用于激活任意单元。请注意,除非设备在 udev 数据库中使用“systemd”字符串进行标记,否则不会考虑此标记和其他标记,因为否则设备不会公开为 systemd 单元。
您只需要一个服务文件/etc/systemd/system/media-USBDRIVE.mount.wants/
:
[Unit]
Description=Backup files to USBDRIVE
Requires=media-USBDRIVE.mount
After=media-USBDRIVE.mount
[Service]
ExecStart=/path/to/backupscript
[Install]
WantedBy=media-USBDRIVE.mount
注意:这假设您的 USB 驱动器名为 USBDRIVE 并且安装在/media/USBDRIVE
.
答案2
如果你正在使用systemd
那么这个人这里已经回答了这个问题。
放置规则
KERNEL=="sd?1",ACTION=="mount",RUN+="/path/to/script.sh"
在
/etc/udev/rules.d/
请注意重新执行时的警告root
,将您需要执行的任何操作放入脚本中。