0

我的用例是远程在多台服务器上运行命令。我在主机之间建立了信任。

所以我有一个这样的命令:命令 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

当我结合(COMMAND 1 + COMMAND 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

但是现在当我结合 COMMAND 1 和 COMMAND 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

我可以猜测引号可能使用不当,但我尝试了各种组合,但对我不起作用。我在编写脚本方面没有太多经验,所以请原谅明显的错误。

4

2 回答 2

0

我认为以下引用应该有效...

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-18T05:01:27.590 回答
0

bash 或任何其他 shell 无法在远程交互操作中进行良好的处理。

使用期望语言做你想做的事。http://expect.sourceforge.net/

我们在超过 1000 台主机中使用了 expect,它工作正常,试试 :)

于 2013-10-18T04:55:34.213 回答