命令中的Linux命令

时间:2013-10-18 04:40:43

标签: linux bash shell awk quotes

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

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

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

2 个答案:

答案 0 :(得分:0)

bash或任何其他shell无法在远程交互操作中采取良好的过程。

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

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

答案 1 :(得分: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

更新:请不要因为转义字符的数量而自杀。