Я немного подумал и решил, что в основном сохраняю свой способ кодирования
я не знаком с ksh, поэтому мне приходится кодировать в bash
извините, если вам нужно перевести
нужен временный файл
потому что for
и while
оба порождают оболочку sub -в конвейерах, поэтому не могут передавать значения массива
вы можете изменить шаблон файла, чтобы mktemp
поместить временный файл в каталог, который вам не нужно будет обрабатывать
замените часть эха в цикле while на ваш код
#!/bin/bash
i=0
tmp=`mktemp /tmp/findingXXXXXX`
find "$CDIR" ! -type d -mtime +7 |awk '{print "F_ARR["(NR-1)"]="$0}' >$tmp
. $tmp
rm -f $tmp
while [ "${F_ARR[$i]}" != "" ];
do
echo i=$i ${F_ARR[$i]}
((i++))
done
То, как я это делаю, похоже на это
while :
do
rsync... && break
sleep 60
done
Инструмент rsync
завершает работу со статусом 0 (успех )после успешного завершения, что прерывает цикл. В противном случае следует 60-секундная пауза и повторный запуск цикла. В моей собственной реализации этого я склонен использовать более длительную задержку, а также счетчик для выхода из цикла после k
попыток:
ss=127 k=4
while [[ $((k--)) -gt 0 ]]
do
rsync... && ss=0 && break
ss=$?
[[ $k -gt 0 ]] && sleep 300
done
echo "completion status of last rsync is $ss"
После обновления вашего вопроса вот команда rsync
, которую я бы использовал
rsync -rtlzq -e "ssh -i c:/RsyncKeys/wa-ecy-gov-test-rsync-key -o ConnectTimeout=140 -o ServerAliveInterval=15" --exclude-from='rsyncfilter.txt' --force --delete --log-file=c:/rsynclogs/rsync11-05-2020.log cran-rsync@cran.r-project.org: //sdceco/Apps/RSTUDIO/RpackagesNew
Изменения
ServerAliveInterval=15
для транспорта ssh
для принудительного отключения после 45 секунд отсутствия ответа сервера -v
(--verbose
)или --stats
, потому что вы отменили их с помощью-q
(--quiet
)--timeout
, так как он управляется ssh
на транспортном уровне -l
может потребоваться заменить на -L
в файловых системах Windows. Я не внес это изменение здесь, но вы (и будущие читатели )должны знать об этом