rsync com o cron job a cada minuto

0

Estou transferindo arquivos pela rede usando o rsync no cron job que é executado a cada 1 minuto, a tarefa é sempre que um novo arquivo é enviado, ele precisa iniciar o upload no servidor remoto:

Desde que eu sou novo, fazendo um grande erro aqui:

* * * * * rsync -azP /local_path [email protected]:/remote_path > /dev/null

rsync cria arquivo temporário (no final remoto) e no minuto seguinte cria novamente o arquivo temporário (no final remoto) após alguns minutos minhas redes começam a ficar sufocadas e nenhuma largura de banda sobrando, então eu mato todos os processos rsync e copio em um tempo.

Precisa disso automatizado, por favor ajude.

Obrigado

    
por ALi 15.08.2018 / 18:50

2 respostas

1

Parece que isso ocorre porque o comando leva mais de um minuto para ser executado, por isso os comandos se acumulam até que o sistema fique sem recursos.

Você pode garantir que apenas uma instância desse rsync seja executada usando um arquivo de bloqueio. util-linux inclui um wrapper de bloqueio de arquivos chamado flock , que você pode usar no seu crontab assim:

* * * * * /usr/bin/flock -n '/tmp/example.lock' -c 'rsync -azP /local_path [email protected]:/remote_path' > /dev/null

No exemplo acima, o caminho do arquivo de bloqueio é /tmp/example.lock , mas você pode defini-lo como algo sensato. -n impedirá que os comandos flock se acumulem, porque ele sairá imediatamente, em vez de esperar que o bloqueio seja liberado para continuar.

Alternativamente, você também pode evitar que o seu comando cron se acumule, fazendo um script com um bloqueio razoavelmente simples que garanta que apenas uma instância do script possa estar sendo executada por vez:

#!/bin/bash

PIDFILE=/tmp/example.pid

if [ -f "$PIDFILE" ]
then
        PID="$(cat "$PIDFILE")"
        ps -p $PID > /dev/zero 2>&1
        if [ $? -eq 0 ]
        then
                echo "Instance of this script is still running as PID $PID"
                exit 1
        fi
fi

echo $$ > $PIDFILE
if [ $? -ne 0 ]
then
        echo "Could not create PID file: $PIDFILE"
        exit 1
fi

# YOUR CODE GOES BELOW
rsync -az /local_path [email protected]:/remote_path
# YOUR CODE GOES ABOVE

rm -f "$PIDFILE"

Mecanismo de bloqueio inspirado em Impedindo execuções duplicadas de tarefas cron por Benjamin Cane

Note que a principal limitação do script é se o arquivo PID não for removido por qualquer razão e outro processo tiver o mesmo PID, o script erroneamente será encerrado.

Salve esse script em algum lugar, como em /usr/local/bin/example.sh , chmod +x /usr/local/bin/example.sh e, em seguida, chame-o do seu crontab assim:

* * * * * /usr/local/bin/example.sh > /dev/null
    
por 15.08.2018 / 19:04
0

Antes de mais nada, remova a opção -P , o cron realmente não verá o progresso.

Você precisa implementar algum mecanismo de bloqueio, não chame rsync diretamente do cron, mas crie um script que seria usado no cron. No script, marque a primeira condição se rsync já estiver em execução (grep ps output, por exemplo), se estiver em execução, basta sair do script, caso contrário, execute rsync .

    
por 15.08.2018 / 18:58