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"
しかし、最初のサーバーの後で停止します。
ありがとう:).
すべての行を読み取らないようにするには、ループ内のSSHコマンドのstdinをどこにもリダイレクトしないようにする必要があります。これはそれを行うはずです:
http_status=$(ssh $name "ps -ef | grep -v grep | grep $service | wc -l" < /dev/null)
-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からの読み取りを防ぎます)。
pssh
を使用しないのはなぜですか?
https://github.com/lilydjwg/pssh
これは、ファイルからホストのリストを取得するためのサポートが組み込まれている並列SSHツールです。
pssh -h network_list.txt ps -ef | grep -v grep | grep $service | wc -l
次に、出力を好きなように解析できます