由 udev 规则调用时脚本不工作

Script not working when evoked by udev rule

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

如有任何帮助,我将不胜感激。

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

首先,你的规则是错误的。考虑这样的事情:

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