问题描述
有没有办法在安装特定的USB设备时运行脚本?
我将我的视频保存在单独的USB上,并希望运行一个脚本,将USB设备上的视频文件夹安装到主文件夹中的视频文件夹。
最佳解决方法
首先在lsusb
中找到您的设备。注意ID(例如0a81:0101
)
通过sudoedit /etc/udev/rules.d/100-mount-videos.rules
在/etc/udev/rules.d/
中创建一个新的udev规则文件,然后像这样在其中新建一条规则:
ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"
请注意我是如何使用lsusb
中的ID的。
然后你只需编写脚本来完成工作。一个简单的mount命令应该可行。你可能需要一个sleep 5
命令来等待文件系统初始化(如果你让gnome进行主安装 – 但你可以先安装它然后你可能不需要睡眠)。
来自Allan的补充:长时间运行的脚本可能会阻止“此设备或依赖设备的所有其他事件”。 My Mint手册页进一步指出“长时间运行的任务需要立即脱离事件过程本身。”没有给出关于从哪里获得技能的提示。
来自Oli的回复:像这样包装:https://askubuntu.com/a/106359/449
次佳解决方法
现在有更好的systemd解决方案。您创建的服务取决于您所需的媒体,例如:/etc/systemd/system/your.service
[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount
[Service]
ExecStart=/home/you/bin/triggerScript.sh
[Install]
WantedBy=media-YourMediaLabel.mount
然后您必须启动/启用该服务:sudo systemctl start your.service
sudo systemctl enable your.service
mount之后,systemd会触发你的触发器脚本。优于udev规则的优点是脚本在挂载后真正触发,而不是在添加系统设备之后触发。
使用案例:我有一个加密分区,我想自动备份。添加设备后,我必须使用type-in密码。如果我将备份脚本挂钩到udev,则脚本会在我输入密码时尝试运行,这将失败。
注意:您可以使用以下命令找到您的设备单元:sudo systemctl list-units -t mount
第三种解决方法
获取ATTRS {idVendor}和ATTRS {idProduct}(在Ubuntu 12.04中测试)的值的另一种方法是:
-
找到你的USB安装位置:
$ mount | grep /dev/sd*
这显示如下内容:
/dev/sdb on /media/SOMEDIR type vfat ...
-
使用udevadm获取该设备信息:
udevadm info -q all -n /dev/sdb | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*'
输出应该是这样的:
E: ID_MODEL_ID=001a E: ID_VENDOR_ID=002b
-
现在使用ATTRS {idProduct}的模型ID和ATTRS {idVendor}的供应商ID
ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...