由 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"
) &
我是 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"
) &