Вам не нужно принуждать , вывод
через замену процесса. Перенаправление работает нормально для этого:
man ls > tem.txt
Даже если вы так используете замену процесса, не забудьте использовать цитаты, в противном случае вывод будет проходить расщепление + глобубинг из оболочки:
echo "$(man ls)" > tem.txt
Да. Он попытается скопировать с первого, если это произойдет, он попробует вторую, и если это тоже не удается, он попробует третий. Чтобы по электронной почте вам по электронной почте в конце, используйте это:
scp ... || scp ... || scp || echo "All attempts failed" | mailx -r "foo@bar.com"
, чтобы каждая команда SCP сообщила вам, если она не удалась, вы можете использовать SUBShells:
scp ... || (echo "machine1 down" | mailx -r "foo@bar.com"&& scp ... ) ||
( echo "machine2 down" | mailx -r "foo@bar.com" && scp ... ) ||
echo "All attempts failed" | mailx -r "foo@bar.com"
То, что произойдет, будет основано на любых командах, которые вы скажете вашему скрипту выполнить. Я не мастер-кодер, но недавно у меня была похожая ситуация.
Я просто создал несколько переменных для возможных серверов, а затем использовал цикл для проверки соединения с этими IP, когда он обнаружит, что это работает, установите этот IP как используемый (FTPHOST) :
USER=имя пользователя
PASS=пароль
attempt1=your. first.server.ip
attempt2=your.second.server.ip
attempt3=your.third.server.ip
curl --connect-timeout 5 ftp://$USER:$PASS@$attempt1 >> /dev/null 2>&1;
if [ $? == '0' ];
then
FTPHOST=$attempt1;
echo "FTPHOST set to $FTPHOST"
else
echo "Connection to $attempt1 failed. Attempting next IP";
curl --connect-timeout 5 ftp://$USER:$PASS@$attempt2 >> /dev/null 2>&1;
if [ $? == '0' ];
then
etc. etc.., повторите цикл для стольких IP, сколько у вас есть, пока он не обнаружит, что это работает. Если ничего не сработает, то, конечно, вы ничего не будете скачивать оттуда, так что заставьте ваш скрипт вести себя соответственно.