Bash 挂载USB密钥后执行脚本
我尝试运行一个脚本,通过检查USB密钥的标签来识别它,并且它有一个包含标识符的文件。我最初的灵感来源于此-> 这是udev规则。它工作正常并正确调用我的脚本Bash 挂载USB密钥后执行脚本,bash,udev,Bash,Udev,我尝试运行一个脚本,通过检查USB密钥的标签来识别它,并且它有一个包含标识符的文件。我最初的灵感来源于此-> 这是udev规则。它工作正常并正确调用我的脚本 KERNEL=="sd[b-z]1", SUBSYSTEM=="block", ACTION=="add", GROUP="plugdev", OWNER="tuxin", RUN+="/home/tuxin/insert-usbkey.sh %k" 下面是一个脚本,简化为最简单的表达式,用于测试该操作 #!/bin/bash exec
KERNEL=="sd[b-z]1", SUBSYSTEM=="block", ACTION=="add", GROUP="plugdev", OWNER="tuxin", RUN+="/home/tuxin/insert-usbkey.sh %k"
下面是一个脚本,简化为最简单的表达式,用于测试该操作
#!/bin/bash
exec </dev/null >/tmp/key-inserted.log 2>&1; PS4=':$LINENO+'; set -x
KEY_LABEL="DEV_JP"
cd /media/tuxin || exit
(
for ((retries=0; retries<10; retries++)); do
[[ -d "$KEY_LABEL" ]] && grep -q -e "$KEY_LABEL" /proc/mounts && continue
sleep 1
done
cd "$KEY_LABEL" || exit
echo "SUCCESS"
) &
脚本在手动启动时工作正常,但由udev执行,在我看来,一旦安装了密钥,它就被杀死了。我如何做我想做的,在自动检测安装后操作钥匙
下面是测试此脚本的机器的摘要(有无后台操作)。我们仍然需要理解为什么这在LinuxMint中不起作用
Distribution udev version Result
-------------------------------------
Linux Mint 18 229 KO
L.M.D.E. 215 OK
Poky custom. 182 OK
Linux Mint 18 229 KO
Lubuntu 18.04 237 OK
测试脚本在后台子shell中运行其主逻辑。因此,它几乎在启动子shell之后立即完成,因此父bash进程会尽职尽责地向所有子进程发出信号,在子shell能够做很多事情之前杀死它 既不需要背景,也不需要二次外壳;以下内容与我的系统上的udev完美配合:
#!/bin/bash
exec </dev/null >/tmp/key-inserted.log 2>&1; PS4=':$LINENO+'; set -x
KEY_LABEL="DEV_JP"
cd /media/tuxin || exit
for ((retries=0; retries<10; retries++)); do
[[ -d "$KEY_LABEL" ]] && grep -q -e "$KEY_LABEL" /proc/mounts && break
sleep 1
done
cd "$KEY_LABEL" || exit
ls . # Double-check by listing the drive's contents
echo "SUCCESS"
#/bin/bash
exec/tmp/key-inserted.log 2>&1;PS4=':$LINENO+';集合x
KEY\u LABEL=“DEV\u JP”
cd/media/tuxin | |退出
为了((retries=0;retries我不能告诉你,但是对于一个写得很好的问题+1。奇怪。添加一些陷阱来检测是否发出信号,并重定向到/tmp/key inserted.log。$$$
以确保文件不会被另一个实例截断。我将udev日志置于“调试”模式:udevadm control--log priority=debug
,下面的re只是对我的脚本的一次调用。@Tuxin如果此脚本没有看到装入点,但在脚本退出后确实看到了装入点,则可能是您的脚本的udev规则运行得太早。请使用99 zzz usbkey.rules
之类的名称命名规则文件,以确保它将在所有系统USB装入相关规则后运行。如手册页所示ays:“所有规则文件都按照词法顺序进行集体排序和处理,而不考虑它们所在的目录。”不,Adrian,我已经测试了一些规则的名称,包括99,它不会改变任何东西。当脚本没有看到挂载点时,就真的没有!当挂载点存在时,脚本在看到它之前就已经停止了。然后发生了一些奇怪的事情。请在pastebin.com(或其他一些pastebin网站)上发布完整的udev调试日志,精确显示插入USB驱动器时发生的情况。这些日志是安装密钥和停止脚本时的日志(后台子shell)。而且,当键没有挂载并且脚本结束时。好吧,我被难住了。我可以确认我发布的前台脚本在Lubuntu 18.04上使用系统udev v237运行良好,并且不会阻止udisksd自动挂载。如果v215和v237之间出现回归,您可以尝试其他发行版。
Distribution udev version Result
-------------------------------------
Linux Mint 18 229 KO
L.M.D.E. 215 OK
Poky custom. 182 OK
Linux Mint 18 229 KO
Lubuntu 18.04 237 OK
#!/bin/bash
exec </dev/null >/tmp/key-inserted.log 2>&1; PS4=':$LINENO+'; set -x
KEY_LABEL="DEV_JP"
cd /media/tuxin || exit
for ((retries=0; retries<10; retries++)); do
[[ -d "$KEY_LABEL" ]] && grep -q -e "$KEY_LABEL" /proc/mounts && break
sleep 1
done
cd "$KEY_LABEL" || exit
ls . # Double-check by listing the drive's contents
echo "SUCCESS"