8

我知道 Ubuntu(和 Fedora)使用Upstart而不是经典的 System V init 守护进程(SysVinit)。

我想知道如何检测何时插入 USB 驱动器、挂载它并将一些文件复制到其中。我希望 Upstart 为此调用我自己的脚本。

如果可能的话,我希望 Upstart 为特定的USB 驱动器调用脚本,这样我就可以获得每个 USB 驱动器的正常功能,除了我的“即时备份”USB 驱动器。

如果 Upstart 可以将 USB 驱动器标识字符串作为参数发送到我的脚本,我想这将是理想的解决方案,因为我可以在脚本中包含 id 字符串,并且可能使脚本处理两个 USB 驱动器而无需变化很大。

顺便说一句,你知道除了 Upstart 之外的任何其他系统,它以一种很好的方式处理 USB 驱动器、网络安装的文件系统等?(因为SysVinit 似乎不是。)

4

2 回答 2

8

upstart似乎没有开箱即用的“usb device plugged in”信号。到目前为止,重点一直是做与 init 几乎完全相同的事情,并且“很酷的广告功能”是在未来。

来自 Fedora wiki:“......现在让 Upstart 本身就位,即使它现在只能像 SysV 那样运行,也将使我们能够开始向这个模型的平稳过渡。”

幸运的是,您可以通过让 udev 运行脚本来发送您的自定义 upstart 信号来自己实现未来,以便 upstart 可以调用您的备份脚本。您也可以让 udev 直接调用您的备份脚本。

udev已经有一种简单的方法来在设备插入和拔出时运行脚本。请参阅使用 udev 规则重命名您的 USB 硬盘驱动器的设备名称。在我的系统上,我必须使用udevadm monitor --env而不是教程的udevmonitor --env. 遵循本教程后,您将创建另一个像这样的 udev 规则:

echo 'SUBSYSTEM=="block", ID_SERIAL_SHORT=="101A9041C67D182E", \
NAME="myusbdrive", \
RUN+="/my/backup/script $env{NAME}"' > /etc/udev/rules.d/S96-mydrive.rules

替换ID_SERIAL_SHORT为您的设备的实际 ID,以及$env{NAME}您的脚本查找备份设备所需的任何 udev 环境变量。您可能需要将脚本置于后台以避免阻塞 udev。

如果你想使用 upstart,你可以让你的 udev 规则运行/sbin/initctl emit back-it-up VARIABLE=$env{VARIABLE} ...,然后写一个以/etc/event.d行开头的脚本start on back-it-up

另请参阅如何在 Python 中侦听 Linux 中的“插入 USB 设备”事件?有关对DBus执行相同操作的提示。如果您想让登录的用户运行用户模式“监视备份驱动器”守护程序,DBus 可能会更方便。

于 2009-02-27T13:45:36.253 回答
4

在 Ubuntu 9.10 和更新版本中,Upstart 通过该upstart-udev-bridge服务具有一些 udev 功能。

#thumbdrive_special.conf
start on block-device-added

task

script
   if [ `blkid $DEV` -eq "YOUR-THUMBDRIVES-UUID" ]; then
      /home/you/bin/thumbdrive_special $DEV
   fi
end script

我喜欢新贵的简单和优雅。但是,如果不太优雅,DBus 解决方案可能会更好。使用 DBus 解决方案,您可以向用户弹出通知并提供简单的用户控制。

于 2010-08-18T17:44:31.440 回答