2012-10-10 60 views
1

我的脚本循环为:对于在脚本壳牌

for i in $(seq $nb_lignes) a list of machines 
do 
ssh [email protected]$machine -x "java ....." 
sleep 10 
done 

- >我执行从设备C此脚本

我有两台机器A和B($ nb_lignes = 2)

ssh [email protected]$machineA -x "java ....." : create a node with Pastry overlay 
wait 10 secondes 
ssh [email protected]$machineB -x "java .....":create another node join the first (that's way i  have use sleep 10 secondes) 

i。从设备C运行脚本: 我想,它显示:节点1被创建,等待10秒,并显示节点2被创建

我的问题:它显示节点1仅创建

我条C它diplay节点2被创建CTRL +

PS:两个过程的java仍然在机器A和B

谢谢乳宁你

+2

你的循环是'因为我在......',但你引用'$机'在循环体内。我想你的真正意思是'机器在...'中。请发布尽可能接近您实际运行的代码的代码,以便我们不必猜测原始代码中的哪个问题以及您重新输入时引入的问题。 –

回答

1

尝试“ssh”命令后的“&”字符。这个过程分别产生[背景]并继续与脚本。

否则,您的脚本会卡住运行ssh。

编辑:为清楚起见,这将是你的脚本:

for i in $(seq $nb_lignes) a list of machines 
do 
ssh [email protected]$machine -x "java ....." & 
sleep 10 
done 
+0

进一步解释:被困在第一个SSH程序中,当你Ctrl-C你杀死THAT进程时,然后允许你移动到创建节点2.看看为什么在你点击Ctrl-C之后会这么说? – armani

+0

没有与CTRL-C的进程没有被杀死,当我点击CTRL + C它通过au第二次迭代(shell不会返回与CTRL + C ..它通过au第二次迭代,它显示节点2创建!! – user1735757

+0

:我现在无法访问机器,我已经添加了&但它没有执行睡眠10! – user1735757

2

从办法,我读这篇文章,阿玛尼是正确的;因为你的java程序没有退出,所以循环的第二次迭代不会运行,直到你“破坏”第一次。我猜测Java程序忽略了ssh发送给它的中断信号。

而不是背景每个SSH与&,你可能会更好使用由ssh本身提供给你的工具。从SSH手册页:

-f  Requests ssh to go to background just before command execution. 
     This is useful if ssh is going to ask for passwords or 
     passphrases, but the user wants it in the background. This 
     implies -n. The recommended way to start X11 programs at a 
     remote site is with something like ssh -f host xterm. 

所以......你的脚本会是这个样子:

for host in machineA machineB; do 
    ssh -x -f [email protected]${host} "java ....." 
    sleep 10 
done 
+0

+1不错的选择... – Baba