我编写了一个 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