Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 挂载USB密钥后执行脚本_Bash_Udev - Fatal编程技术网

Bash 挂载USB密钥后执行脚本

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

我尝试运行一个脚本,通过检查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 </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"