Я исправил эту проблему. Проблема возникла из-за синтаксической ошибки.
Ошибка была связана с положением символов " и '. Нужно было просто заменить ' на ", и тогда все заработало.
login=$(curl -X POST -H "ACCEPT-LANGUAGE:en" -H "Content-Type: application/json;charset=utf-8" -H "Accept-Encoding:gzip,deflate" -H "Accept: application/json" -H "Connection: keep-alive" -d "{"serviceUuid":"${service_uuid}","password":"${password}"}" HereTheUrl)
и
uuid=$(curl -X POST -H "ACCEPT-LANGUAGE:en" -H "Content-Type:application/json" -H "Accept: application/json" -d "{"username":"TheUserName"}"
Эту проблему лучше всего решать на этапе ротации, а не на этапе копирования и архивирования. Если вы измените ротацию журналов на дату файлов, а не дадите им порядковые номера, тогда для архивирования rsync не потребуется никакой логики для правильной работы ™.
Предполагая, что вы уже используете logrotate для вращения, это можно сделать с помощью параметра dateext
. Но если приложение управляет собственной ротацией, его может быть сложнее настроить. Я знаю, что log4j также может добавлять даты к повернутым файлам, но это может не отображаться через конфигурацию и поэтому может потребовать изменения в приложении. Вы также можете отключить ротацию на уровне приложения и вместо этого использовать logrotate.
В конце передачи rsync
проверяет, совпадает ли переданный файл с тем, который начали передавать. Если файлы не совпадают, он предупреждает вас об этом и переходит к следующему. Если у вас стоит --remove-source-files
, он не будет удалять файл, который, по его мнению, был передан неправильно или не полностью.
При условии, что существует окно возможностей, в течение которого rsync
может успешно передать файлы журнала, нет большого вреда в том, чтобы повторять rsync
чаще - или даже повторять его до тех пор, пока он не будет успешным:
k=3
while test 0 -lt $k && k=$((k-1))
do
rsync .... && break
sleep 10
done
Если это не сработает, вам придется подумать о том, как сделать "моментальный снимок" файлов журнала на время, достаточное для копирования:
ssh -q remote_host 'mkdir -p rsync.tmp; cp -p *.log rsync.tmp/'
rsync -a --remove-source-files remote_host:/path/to/logs/rsync.tmp/*.log ....