我的用例是远程在多个服务器上运行命令。我信任主机之间的信任。
所以我有一个这样的命令: 命令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
我猜可能有不当使用引号,但我尝试了各种组合,但它对我不起作用。 我没有太多的脚本编写经验,所以请原谅明显的错误。
答案 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
更新:请不要因为转义字符的数量而自杀。