我是Linux Mint用户,我正在尝试编写一个规则,当我插入USB时执行脚本。 #!/bin/sh script
,没有成功
如果我运行相同的话,访问USB(即使使用普通的CD)
从命令行编写脚本,它运行得很好。
我为此目的创建的规则是:
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="058f", ATTR{idProduct}=="6387", RUN+=="/home/dario/bin/backup_usb"
例如,backup_usb如下所示:
#!/bin/sh
sleep 10
cd /media/dario/
echo " I am now in: $(pwd)" >> /home/dario/bin/log.log
cd /media/dario/DARIO_USB/ # That's the device just plugged in.
echo " I am now in: $(pwd)" >> /home/dario/bin/log.log
输出结果为:
I am now in: /media/dario/
and now in: /
虽然我在期待:
I am now in: /media/dario/
and now in: /media/dario/DARIO_USB/
我将非常感谢任何帮助。
(这是我的问题的编辑版本)
答案 0 :(得分:1)
首先,你的规则是错误的。考虑类似的事情:
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="058f",
ATTR{idProduct}=="6387", RUN+="/home/dario/bin/backup_usb"
第二:杀死sleep 10
。如果udev按顺序运行脚本并在运行下一个脚本之前等待每个脚本完成,它可能会阻止任何后续脚本(例如执行挂载的脚本),从而阻止它发生。我们将以不同的方式执行此操作,将轮询置于后台:
#!/bin/bash
# ^^^^ - has to be bash, as the C-style for loop syntax used below is a bashism
# ...as is the [[ ]] construct.
exec </dev/null >/home/dario/usb.log 2>&1
set -x
cd /media/dario || exit
(
for ((retries=0; retries<10; retries++)); do
[[ -d DARIO_USB ]] && grep -q -e DARIO_USB /proc/mounts && continue
sleep 1 # retry
done
cd DARIO_USB || exit
echo "SUCCESS"
) &