bash 脚本中的 inotify 无法与 ldapadd 命令一起使用

bash 脚本中的 inotify 无法与 ldapadd 命令一起使用

我编写了一个 bash 脚本,用于检测.ldif文件是否已写入目录,如果已写入,则执行命令ldapadd,然后删除该文件。脚本如下:

dir="/home/myuser/newldif/"
        while inotifywait -e create "$dir"; do
              ldapadd -w "ldappassword" -D "cn=Manager,dc=mydomain,dc=com" -f /home/myuser/newldif/user.ldif
              rm -rf /home/myuser/newldif/user.ldif
        done

脚本执行如下:

nohup ./testscript &

该目录newldif最初是空的。当将文件user.ldif复制到此位置时,脚本将执行但会跳过命令ldapadd并执行rm命令。

另一方面,当我执行没有的脚本时inotify(即我while完全删除了循环),它会添加 ldap 条目,然后删除该文件。

inotify 语法有什么问题吗?slapd 日志没有显示任何错误。该nohup.out文件仅显示以下输出:

Setting up watches.
Watches established.
Setting up watches.
Watches established.
Setting up watches.
Watches established.

(每个“设置监视”语句针对一个已删除的文件)

操作系统是CentOS 6.4,OpenLDAP版本是openldap-2.4.23。

答案1

如果 rm 正在从该脚本执行,那么您的逻辑就没有问题。

这可能是一个时间问题,即在脚本运行 ldap 命令时,文件在目录中创建但未填充。尝试添加cat文件以查看。然后尝试等待close_write目录上的事件,这样您就会有一个完全填充的文件。这也可能不够,因为这取决于您如何写入文件。通常最安全的方式是在其他地方创建一个临时文件,然后在完全填充后将其移动到位,因为这是一个更原子的文件系统操作。

此外,为您期望的文件或命令添加一些错误检查也是一个好主意:

#!/usr/bin/env bash

dir="/home/myuser/newldif/"
file="user.ldif.tmp"
ldf="$dir/$file"

while inotifywait -e close_write "$dir"; do

  # Check if the file we want exists in the directory being monitored. 
  if [ ! -f $ldf ]; then 
    echo "No file [$ldf]"; 
    continue;
  fi

  # Add users via ldap
  echo "Adding users:"
  mv $ldf $dir/user.ldif
  ldapadd -w "ldappassword" -D "cn=Manager,dc=mydomain,dc=com" -f $dir/user.ldif || echo "failed adding users" && exit 1

  # Remove file when done
  echo "Removing file"
  rm $dir/user.ldif || echo "failed removing file" && exit 1
done

相关内容