当udev规则引发时脚本不起作用

时间:2016-01-27 18:42:39

标签: bash udev

我是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/

我将非常感谢任何帮助。

(这是我的问题的编辑版本)

1 个答案:

答案 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"
) &