Я передаю файлы по сети с помощью rsync в задании cron, которое запускается каждые 1 минуту, задача состоит в том, чтобы при появлении нового файла загружать его на удаленный сервер:

Так как я новичок, я делаю здесь большую ошибку:

* * * * * rsync -azP /local_path user@x.x.x.x:/remote_path > /dev/null

rsync создает временный файл (на удаленном конце), и на следующей минуте он снова создает временный файл (на удаленном конце), через несколько минут мои сети начинают задыхаться и пропускной способности загрузки не остается, затем я убиваю все процессы rsync и копирую их одновременно.

Нужно это автоматизировать, пожалуйста, помогите.

Спасибо

2 ответа2

1

Похоже, это потому, что выполнение команды занимает больше минуты, поэтому команды накапливаются до тех пор, пока ваша система не будет нуждаться в ресурсах.

Вы можете убедиться, что только один экземпляр этого rsync работает, используя файл блокировки. util-linux включает в себя оболочку для блокировки файлов с именем flock , которую вы можете использовать в вашем crontab следующим образом:

* * * * * /usr/bin/flock -n '/tmp/example.lock' -c 'rsync -azP /local_path user@x.x.x.x:/remote_path' > /dev/null

В приведенном выше примере путь к файлу блокировки - /tmp/example.lock , но вы можете установить для него что-нибудь разумное. -n предотвратит команды flock из нагромождения , потому что он будет выходить сразу вместо того , чтобы ждать на замок , чтобы быть освобожден , чтобы продолжить.


Кроме того, вы также можете предотвратить накопление команды cron, создав скрипт с довольно простой блокировкой, которая гарантирует, что одновременно может выполняться только один экземпляр скрипта:

#!/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 user@x.x.x.x:/remote_path
# YOUR CODE GOES ABOVE

rm -f "$PIDFILE"

Механизм блокировки, вдохновленный предотвращением повторных выполнений заданий cron Бенджамином Кейном

Обратите внимание, что основным ограничением в сценарии является то, что если файл PID по какой-либо причине не удален и другой процесс имеет такой же PID, сценарий будет ошибочно завершен.

Сохраните этот скрипт где-нибудь, например, в /usr/local/bin/example.sh , chmod +x /usr/local/bin/example.sh , а затем вызовите его из вашего crontab следующим образом:

* * * * * /usr/local/bin/example.sh > /dev/null
0

Прежде всего, удалите опцию -P , cron действительно не увидит прогресса.

Вам нужно реализовать какой-то механизм блокировки, не вызывать rsync напрямую из cron, а вместо этого создать скрипт, который будет использоваться в cron. В сценарии сначала проверьте условие, если rsync уже запущен (например, вывод grep ps), если он работает, просто выйдите из сценария, в противном случае запустите rsync .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .