Назад | Перейти на главную страницу

inotify в сценарии bash не работает с командой 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.

Если 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