我无法让 udev 运行的脚本在 USB 插入时在后台运行。
我的 udev 规则似乎有效,因为它确实调用了脚本,但无论我做什么,我都无法让 bash 脚本在后台运行,因此它会被阻止。
以供参考:
我的 udev 规则:
ATTRS{idVendor}=="125f", ATTRS{idProduct}=="db8a", SYMLINK+="usb/adata%n", ENV{XAUTHORITY}="/home/abe/.Xauthority", ENV{DISPLAY}=":0", OWNER="abe", RUN+="/home/abe/bin/usb-adata_udev.sh"
我的bash脚本:
#!/bin/bash
if [[ $ACTION == "add" ]]; then
# I've tried many variations on this, none seem to work
(su abe /bin/bash -c "/home/abe/Documents/Programs/USB\ Sync/usb-in.sh") &
fi
if [[ $ACTION == "remove" ]]; then
/home/abe/Documents/Programs/USB\ Sync/usb-out.sh &
fi
背景脚本:
#!/bin/bash
#echo $ACTION > "/home/abe/Desktop/test.txt"
if [[ ! -d "/media/abe/ABE" ]]; then
# for testing
sleep 10
#udisksctl mount -b /dev/usb/adata1 &> "/home/abe/Desktop/test.txt"
#rsync --update /media/abe/ABE/Files/db.kdbx /home/abe/Documents/db.kdbx
echo "FINISHED" >> "/home/abe/Desktop/test.txt"
fi
直到 10 秒过去,USB 才被 nautilus 安装,并且 udisksctl 命令给出了错误Error looking up object for device /dev/usb/adata1
在取消注释时给出了错误,这让我认为 udev 规则甚至还没有完成符号链接的创建。
请注意,当我从终端而不是 udev 运行该脚本时,它工作正常
答案1
RUN
只能用于短期任务。
RUN{
type
}
... This can only be used for very short-running foreground tasks. Running an event process for a long period of time may block all further events for this or a dependent device. Starting daemons or other long running processes is not appropriate for udev; the forked processes, detached or not, will be unconditionally killed after the event handling has finished.
来源: man udev
您可以使用disown
它将先前的进程与当前 shell 分离。
#!/bin/bash
if [[ $ACTION == "add" ]]; then
# I've tried many variations on this, none seem to work
(su abe /bin/bash -c "/home/abe/Documents/Programs/USB\ Sync/usb-in.sh") & disown
fi
if [[ $ACTION == "remove" ]]; then
/home/abe/Documents/Programs/USB\ Sync/usb-out.sh & disown
fi
类似情况如下:通过/etc/udev/rules.d/连接usb时写入文件也许你也会关注这一点https://askubuntu.com/a/635477/26246由 Fëamarto 提供,很棒的递归技巧,等待分区安装完成。
更新
udev
这些年来发生了很大变化。它已成为一部分,systemd
并且更加受限。以下是当前的选项:
udev
将规则设置为触发systemd
服务。udev
将规则设置为运行脚本来调度作业at
。- 监视目标事件的用户空间脚本(python/pyudev 等)
udev
。