Я написал сценарий 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.
Если 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