我创建了一个 bash 函数来“自动”连接我们的交换机并startup-config
使用expect
命令检索它们。我必须使用,expect
因为这个开关不接受ssh user@host
时尚,并再次询问我用户和密码元组。
这是我创建的用于管理这些备份的功能
main_pc3548(){
/usr/bin/env expect <<-END3548
spawn ssh -o StrictHostKeyChecking=no -o LogLevel=quiet $IP
expect "User Name:"
send "$USER\r"
expect "Password:"
send "$PASS\r"
expect "*# "
send "copy startup-config tftp://$SERVER/$SWNAME.cfg.bkp\r"
sleep 8
END3548
}
此代码块将分隔我的开关类型,并main_pc3548()
在我的开关列表具有此开关模型时调用:
egrep -v '(^#|^\s*$|^\s*\t*#)' $LISTA_SWITCHES | while read IP SWNAME SERVER TIPO
do
if [ "$TIPO" = core ]; then
main_pc6248
elif [ "$TIPO" = dep ]; then
main_pc3548
else
echo "$(date "+%d/%m/%Y-%T") - Switch $SWNOME Have a martian type of switch" >> $LOG_FILE
fi
done
脚本的其余部分读取一个相当长的文件,其中包含有关交换机 IP、TFTP IP 地址、交换机名称的信息,并且每个交换机等待 8 秒会消耗大量时间。这个睡眠是需要的为了避免缓慢的连接破坏 tftp 副本,所以,这是我的问题:
有没有一种简单的方法可以“多线程”这个函数来获得性能?
答案1
解决方案是 @devnull 在评论中给出的提示:在后台执行每个函数
# Trata comentários na lista de switches
egrep -v '(^#|^\s*$|^\s*\t*#)' $LISTA_SWITCHES | while read IP SWNOME SERVER TIPO
do
if [ "$TIPO" = core ]; then
pc6248 &
elif [ "$TIPO" = dep ]; then
pc3548 &
elif [ "$TIPO" = rfs ]; then
rfs6000 &
else
echo "$(date "+%d/%m/%Y-%T") - Switch $SWNOME possui tipo marciano de switch" >> $LOG_FILE
fi
done
现在,20 秒后,大约 50 个交换机已完成备份:)