inotify no script bash não funciona com o comando ldapadd

2

Eu escrevi um script bash que detecta se um arquivo .ldif foi gravado em um diretório e, se escrito, executa um comando ldapadd e, em seguida, exclui esse arquivo. Os scripts são os seguintes:

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

O script é executado da seguinte forma:

nohup ./testscript &

O diretório newldif está inicialmente vazio. Quando o arquivo user.ldif é copiado para esse local, o script é executado, mas ignora o comando ldapadd e executa o comando rm .

Por outro lado, quando executo o script sem inotify (ou seja, eu removi o loop while completamente), ele adiciona a entrada ldap e, em seguida, exclui o arquivo.

Há algo de errado com a sintaxe inotify? Os logs do slapd não mostram nenhum erro. O arquivo nohup.out simplesmente mostra a seguinte saída:

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

(cada declaração "Configurando relógios" é para um arquivo excluído)

O sistema operacional é o CentOS 6.4 e a versão OpenLDAP é openldap-2.4.23.

    
por rahuL 23.08.2013 / 09:43

1 resposta

1

Se o rm estiver sendo executado a partir desse script, não há nada errado com sua lógica.

É provavelmente um problema de tempo em que o arquivo é criado no diretório, mas não é preenchido quando o script executa o comando ldap. Tente adicionar um cat do arquivo para ver. Em seguida, tente aguardar um evento close_write no diretório, para ter um arquivo totalmente preenchido. Isso também pode não ser suficiente, pois depende de como você escreve no arquivo. Geralmente, a maneira mais segura é criar um arquivo temporário em outro lugar, em seguida, movê-lo para o lugar quando totalmente preenchido, já que essa é uma operação do sistema de arquivos mais atômica.

Além disso, adicionar uma verificação de erros para os arquivos que você espera ou comandos também é uma boa ideia:

#!/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
    
por 23.08.2013 / 11:07