执行如下脚本:
#!/bin/bash
source /etc/profile
DIR=$1
if [ -z "$DIR" ];then
echo "DIR can not be empty."
exit 10
fi
BRANCH_NAME=$2
if [ "${BRANCH_NAME}" != "storm" ];then
echo "will exit 0.not build"
exit 0
fi
TARGET_DIR="/home/admin/pro"
ls -l ${DIR}/bigdata-storm/*/target/*jar-with-dependencies.jar | awk '{print $NF}' | while read -r filePath;do
echo "filePath:${filePath}"
fileName=`basename $filePath`
dirName=`basename $filePath ".jar"`
echo "fileName:${fileName}"
echo "dirName:${dirName}"
#command="${TARGET_DIR}/run.sh ${fileName}"
command="mkdir -p '${TARGET_DIR}/${dirName}'"
ssh -p 22 admin@10.6.0.94 "${command}"
scp "${filePath}" "admin@10.6.0.94:${TARGET_DIR}/${dirName}"
done
预期结果 :目录下有多少个 fat jar 就循环执行 ssh 多少次
时间结果:只循环了一次
分析:
while 中使用重定向机制,file1 文件中的信息都已经读入并重定向给了整个 while 语句,所以当我们在 while 循环中再一次调用 read 语句,就会读取到下一条记录,但是,因为 ssh 会读取存在的缓存,调用完 ssh 语句后,输入缓存中已经都被读完了,当 read 语句再读的时候当然也就读不到纪录,循环也就退出了。
解决方法: 对 ssh 使用-n 参数 或者 输入重定向,而防止它去读 while 的缓存,或者使用 for 循环避免使用重定向的方式
ssh -np 22 admin@10.6.0.94 "${command}"
-n 解释如下
-n Redirects stdin from /dev/null (actually, prevents reading from stdin). This must be used when ssh is run in the background. A common trick is to use this to run X11 programs on a remote machine. For example, ssh -n shadows.cs.hut.fi emacs & will start an emacs on shadows.cs.hut.fi, and the X11 connection will be automatically forwarded over an encrypted channel. The ssh program will be put in the background. (This does not work if ssh needs to ask for a password or passphrase; see also the -f option.)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于