web-dev-qa-db-ja.com

サーバーをループしてコマンドを実行する

network_list.txtというテキストファイルで言及されている一連のサーバーがあります。サーバーを介して実行し、コマンドを実行して結果を表示するにはどうすればよいですか?私は以下を試しました:

filename="network_list.txt"
service=httpd
while read -r line
do
    name="$line"
    ping -c 3 $name > /dev/null 2>&1;
    RETVAL=$?
        if [ $RETVAL -ne 0 ]
        then 
           echo "$name is down"
        else 
            echo "$name is up and running"
        fi
    http_status=$(ssh $name ps -ef | grep -v grep | grep $service | wc -l)
        if [ $http_status -ne 0 ]
        then
            echo "$service is up and running in $name"
        else
            echo "$service is down in $name"
        fi
done < "$filename"

しかし、最初のサーバーの後で停止します。

ありがとう:).

7
Crazyrubixfan

すべての行を読み取らないようにするには、ループ内のSSHコマンドのstdinをどこにもリダイレクトしないようにする必要があります。これはそれを行うはずです:

http_status=$(ssh $name "ps -ef | grep -v grep | grep $service | wc -l" < /dev/null)
7
Khaled

-n -xパラメータを使用した解決策があります:

http_status=$(ssh -nx name ps -ef | grep -v grep | grep $service | wc -l)

-xは、X11転送を無効にして、可能なX11 forwarding request failedメッセージを削除します。

-nは、stdinを/ dev/nullからリダイレクトします(実際には、stdinからの読み取りを防ぎます)。

8
Jaroslav Kucera

psshを使用しないのはなぜですか?

https://github.com/lilydjwg/pssh

これは、ファイルからホストのリストを取得するためのサポートが組み込まれている並列SSHツールです。

pssh -h network_list.txt ps -ef | grep -v grep | grep $service | wc -l

次に、出力を好きなように解析できます

1
Daniel Scott