【问题标题】:Script not working when evoked by udev rule由 udev 规则引发时脚本不起作用
【发布时间】:2016-01-27 18:42:39
【问题描述】:

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

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

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

【问题讨论】:

  • “不工作”不足以让我们工作。至少,设置日志记录。此外,所有=3D 的东西都被破坏了——每个=3D 都应该是一个= 符号,=20 同样是空格的转义码。
  • 另外,您正在标记您的问题 bash,但使用 #!/bin/sh 表示 POSIX sh。它只能是一个或另一个;是哪个?
  • 我想我不知道它是怎么称呼的。我正在使用#!/bin/sh。 tag: shell 是正确的标签吗?
  • 本人不懂脚本,请多多指教!
  • 是的,shellshbash 更适合 #!/bin/sh。或者您可以只使用 #!/bin/bash 并保留 bash 标签。 :)

标签: bash udev


【解决方案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"
) &

【讨论】:

  • 感谢您的回答。我编辑我的问题。我有一个问题: exec 2>/path/to/logfile; 是什么?设置-x;做?当从终端调用相同的脚本时,我要求执行的操作也很简单,而且工作正常
  • exec 2&gt;/path/to/logfile 将 stderr 从您的脚本重定向到名为 /path/to/logfile 的文件。 set -x 记录脚本运行的每个命令。
  • 当您从终端运行时,您的环境将大不相同。也许您依赖于交互式 shell 中存在的 PATH 元素,但不存在于 udev 调用的 shell 中——无论原因是什么,日志都应该清楚地说明。
  • 我很高兴您的代码有效。谢谢您的帮助。我接受了这个答案,因为它是最有意义的,但我的主要目标是理解我的错误,不幸的是我仍然没有。无论如何,谢谢你的帮助。
  • @dario,由于这段代码(好吧,( ... ) &amp; 中的部分)在后台运行,其他 udev 脚本不会阻止等待它。这意味着实际安装 USB 设备的单独触发器不会卡在此处您的脚本之后,该脚本需要安装设备才能工作。这有帮助吗?
猜你喜欢
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2013-11-25
相关资源
最近更新 更多