Executando o Unison com o incrond (daemon do cron inotify)

3

Gostaríamos de usar unison para sincronizar dois servidores. Na linha de comando e nos arquivos bash, o seguinte comando funciona bem:

unison -batch /var/www/html/test ssh://host-2//var/www/html/test

Os arquivos estão sendo sincronizados e unison.log está sendo atualizado. até aí tudo bem.

em combinação com um arquivo de preferências, como .unison/default.prf e simplesmente executando unison na linha de comando, conforme descrito aqui , as coisas funcionam bem também.

Também instalamos o daemon do cron incrond inotify e ele está funcionando sem problemas. A tarefa cron seguinte está sendo executada muito bem:

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE touch /root/test

/root/test está sendo atualizado toda vez que faço alterações nos arquivos em /var/www/html/test

Até aí tudo bem! Mas as únicas coisas que não funcionam usando o incrontab são:

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE unison

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/bin/unison

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/local/sbin/unison

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE unison -batch /var/www/html/test ssh://host-2//var/www/html/test

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/bin/unison -batch /var/www/html/test ssh://host-2//var/www/html/test

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/local/sbin/unison -batch /var/www/html/test ssh://host-2//var/www/html/test'

Nada é mostrado no arquivo unison.log , e muito menos na atualização do servidor remoto. O seguinte também não produz nada.

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE unison &> /root/test.log

/root/test.log não está sendo criado.

Outro teste usando um arquivo em lote chamado sync.sh também não funciona.

no incrontab:

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /root/sync.sh

e em sync.sh :

#!/bin/bash

touch /root/test
/usr/bin/unison -batch /var/www/html/test ssh://host-2//var/www/html/test

Novamente, /root/test está sendo tocado, o que significa que o inofify funciona muito bem toda vez que eu atualizo um arquivo em /var/www/html/test , mas novamente nenhum resultado de unison .

/ var / log / cron tem esta aparência:

May 21 06:33:44 Host-1 incrond[28339]: (root) CMD (sh /root/sync.sh)

e o unison.log não está sendo atualizado.

Conclusões:

  1. inotify funciona bem, detecta todas as alterações no sistema de arquivos e executa uma tarefa, exceto para qualquer tarefa unison .
  2. unison funciona bem na linha de comando e em lote, exceto quando chamado pelo daemon incrond .

Eu estou negligenciando alguma coisa?

    
por IT-Smart 21.05.2016 / 13:25

1 resposta

0

Para estabelecer uma conexão SSH, o cliente precisa se autenticar no servidor. Você provavelmente está usando a autenticação baseada em chave, com uma chave armazenada em um arquivo protegido por senha e carregada no agente SSH. O cliente SSH sabe como encontrar o agente por meio da variável de ambiente SSH_AUTH_SOCK . Em um cron ou incron job, o ambiente não é o mesmo que em sua sessão interativa, é bem simples, sem SSH_AUTH_SOCK , então o cliente SSH não pode se conectar à máquina remota.

Se a conexão SSH não puder ser estabelecida, o Unison nem sequer começará a procurar arquivos para sincronizar e nada será gravado em unison.log .

Existem mensagens de erro no erro padrão do script, mas você não está registrando-as em lugar algum. Adicione algo como exec 2>&1 >>~/.unison-sync.log; date ao início do seu script.

Para fazer com que a conexão SSH funcione, você precisará providenciar para que o trabalho em Unison tenha acesso ao seu agente ou para configurar uma chave sem senha. Se você quiser passar pelo seu agente, consulte Não é possível usar o ssh em uma máquina remota usando o shell script no Crontab ; mas só funcionará enquanto você estiver logado. Se você quiser que a sincronização funcione o tempo todo, uma chave sem senha é a única solução. Como você está executando o Unison e, portanto, o SSH como root, a chave privada precisa estar em /root/.ssh , não na sua conta. O mesmo vale para qualquer opção relevante em .ssh/config . No lado do servidor, você pode autorizar a chave pública apenas para executar um comando unison específico com uma diretiva command=… em .ssh/authorized_keys (consulte Criando uma conta UNIX que apenas executa um comando para um exemplo). Com uma restrição de comando, se alguém obtiver acesso à conta raiz local, ele só poderá executar esse comando unison … específico em host-2 ; Não sei se o Unison pode ser induzido a executar código arbitrário dessa maneira.

    
por 22.05.2016 / 01:22