shell脚本关闭集群ES异常,只能kill一个节点的进程

写了一个shell脚本,关闭集群内ES的,已经互相做了免密登录


#! /bin/bash
case $1 in
"stop"){
for i in node0 node1 node2
do
        echo "-----------关闭 $i elasticsearch 开始---------------"
        ssh $i "kill -9 $(lsof -i:9200|awk '{if(NR==2) printf $2}')"
        echo "-----------关闭 $i elasticsearch 结束---------------"
done
};;
esac

集群内三个节点 node0、node1、node2,启动脚本只能 kill node0 节点的进程,其它两个节点没反应,启动脚本结果如下:

img

如上图在 node0 上 lsof -i:9200 可以看到进程已经没了,但其它节点的进程依然还在,如下图:

img

引用 皆我百晓生 小程序回复内容作答:

根据您提供的脚本和结果,可能的原因是在循环中使用了 ssh 命令,并且使用了变量 $i 来代表节点名称。在使用 ssh 命令时,需要将要执行的命令用引号引起来,以确保整个命令字符串被远程执行。您可以尝试以下修改脚本:

#! /bin/bash
case $1 in
"stop")
for i in node0 node1 node2
do
    echo "-----------关闭 $i elasticsearch 开始---------------"
    ssh $i "lsof -i:9200 | awk '{if(NR==2) print \$2}' | xargs kill -9"
    echo "-----------关闭 $i elasticsearch 结束---------------"
done
;;
esac

在上述修改中,我将 lsof 和 awk 命令放在了远程 ssh 命令中,并使用 \$2 来确保对于远程主机而言 $2 被解析为命令参数。

这样修改后,SSH 命令将远程执行 lsof、awk 和 kill 命令来关闭每个节点的 Elasticsearch 进程。这样应该能够关闭每个节点的进程。请确保您对节点有足够的权限以执行关闭进程的操作。