我的用例是远程在多台服务器上运行一个命令。我在主人之间建立了信任。
我有一个这样的命令:命令1:
for i in 11 12 13 14 15 16; do echo host-name-dev-$i; ssh -q host-name-dev-$i "nohup bash -c 'Place Ur command Here' > foo.out 2> foo.err < /dev/null &"; done另一个命令是:命令2:
rm -rf /floderPath当我将这两个命令(命令1+命令2)组合在一起时,它可以正常工作,随后的文件夹将从所有主机中删除。
for i in 11 12 13 14 15 16; do echo host-name-dev-$i; ssh -q host-name-dev-$i "nohup bash -c 'rm -rf /floderPath' > foo.out 2> foo.err < /dev/null &";done现在我有了另一个命令。如果我单独在所有主机上运行这个命令,它可以正常工作,并杀死所有的java进程。命令3:
for i in `ps -ef | grep -v grep | grep java | awk '{print $2}'`; do kill -9 $i; echo "Process id $i is killed"; done但是现在,当我将命令1和命令3组合在一起时,它根本不起作用。我在这里要做的是杀死所有主机上的所有JAVA进程。
for i in 11 12 13 14 15 16; do echo host-name-dev-$i; ssh -q host-name-dev-$i "nohup bash -c 'for j in `ps -ef | grep -v grep | grep java | awk '{print $2}'`; do kill -9 $j; echo "Process id $j is killed"; done' > foo.out 2> foo.err < /dev/null &";done我可以猜到引号的使用可能不恰当,但我尝试过各种组合,但对我来说没有用。我没有太多的脚本编写经验,所以请原谅明显的错误。
发布于 2013-10-18 05:01:27
我认为下面的引文应该有效..。
for i in 11 12 13 14 15 16; do
echo host-name-dev-$i
ssh -q host-name-dev-$i "nohup bash -c \"for j in \\\`ps -ef | grep -v grep | grep java | awk '{print \\\$2}'\\\`; do kill -9 \\\$j; echo \\\"Process id \\\$j is killed\\\"; done\" > foo.out 2> foo.err < /dev/null &"
done更新:请不要因为转义字符的数量而自杀。
发布于 2013-10-18 04:55:34
在远程交互操作中,bash或任何其他shell都不能接受良好的过程。
使用expect语言来做你想做的事。http://expect.sourceforge.net/
我们在1000多个主机中使用expect,它运行良好,尝试:)
https://stackoverflow.com/questions/19441712
复制相似问题