Executando Unison com incrond (inotify cron daemon)

Executando Unison com incrond (inotify cron daemon)

Gostaríamos de usar unisonpara sincronizar dois servidores. Na linha de comando e em 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.logatualizados. até agora tudo bem.

em combinação com um arquivo de preferências, como .unison/default.prfe simplesmente executando unisona partir da linha de comando conforme descritoaqui, as coisas também funcionam bem.

Também instalamos incrondo daemon cron inotify e ele está funcionando perfeitamente. O seguinte cron job está sendo executado perfeitamente:

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

/root/testestá sendo atualizado sempre que faço alterações nos arquivos em/var/www/html/test

Até agora tudo bem! Mas as únicas coisas que não funcionam com 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 aparece no unison.logarquivo, muito menos atualizar o 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.lognem está sendo criado.

Outro teste usando um arquivo em lote chamado sync.shtambé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/testestá sendo tocado muito bem, o que significa que o inofify funciona muito bem toda vez que atualizo um arquivo no /var/www/html/test, mas novamente nenhum resultado no unison.

/var/log/cron fica assim:

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

e o unison.lognão está sendo atualizado.

Conclusões:

  1. inotifyfunciona bem, detecta todas as alterações no sistema de arquivos e executa uma tarefa, exceto qualquer unisontarefa.
  2. unisonfunciona bem na linha de comando e em lote, exceto quando chamado pelo incronddaemon.

Estou negligenciando alguma coisa?

Responder1

Para estabelecer uma conexão SSH, o cliente precisa se autenticar no servidor. Você provavelmente está usando 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 trabalho cron ou incron, o ambiente não é o mesmo da sua sessão interativa, é mínimo, sem SSH_AUTH_SOCK, portanto o cliente SSH não pode se conectar à máquina remota.

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

Existem mensagens de erro no erro padrão do script, mas você não as registra em lugar nenhum. Adicione algo parecido exec 2>&1 >>~/.unison-sync.log; dateao início do seu script.

Para que a conexão SSH funcione, você precisará providenciar que o trabalho Unison tenha acesso ao seu agente ou configurar uma chave sem senha. Se você quiser passar pelo seu agente, consulteNão é possível fazer ssh na máquina remota usando shell script no Crontab; mas só funcionará enquanto você estiver logado. Se 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 uníssono específico com uma command=…diretiva .ssh/authorized_keys(consulteCriando uma conta UNIX que executa apenas um comandoPor exemplo). Com uma restrição de comando, se alguém obtiver acesso à conta root local, só poderá executar esse unison …comando específico host-2; Não sei se o Unison pode ser induzido a executar código arbitrário dessa maneira.

informação relacionada