У меня есть рабочий резервный скрипт, использующий одну команду rsync для каждого файла, который нужно сохранить.
Теперь я хочу сообщить о ходе выполнения каждой команды rsync в базу данных mysql.Поэтому мне нужно, чтобы вывод --info = progress2 был разбит на массив.
Решение, которое у меня есть, использует именованный канал и второй сценарий, читающий из этого именованного канала и записывающий в mysql.Но я думаю, что должно быть лучшее решение без именованной трубы.Разве невозможно записать вывод rsync непосредственно в IFS?
Это (сокращенные) сценарии, которые я сейчас использую:
Сценарий резервного копирования:
#! /bin/bash
# /root/pipewriter.sh
pipe=/root/rpipe
/root/pipereader.sh $pipe &
# Waiting for pipereader to come up
while [ ! -p $pipe ]
do
# do nothing, just waiting for the pipe to be ready
:
done
rsync --info=progress2 /root/source.file /root/destination.file > $pipe
echo "quit" > $pipe
exit 0
Сценарий, читающий из канала и разбивающий прогресс на массив:
#! /bin/bash
# /root/pipereader.sh
pipe=$1
trap "rm -f $pipe" EXIT
if [ ! -p $pipe ]; then
mknod $pipe p
fi
while true
do
if read line < $pipe ; then
if [[ "$line" == "quit" ]]; then
break
fi
IFS=' ' read -ra vals <<< "$line"
for i in "${vals[@]}"; do
echo $i >> foobar.txt
# doing here mysql commands with $i later
done
fi
done
exit 0
это работает, но я не думаю, что это лучшее решение?