2017-02-05 8 views
1

各サーバーのプロセスgrep pipeコマンドからのPIDの読み取りと終了。 次のスニペットを実行すると、残りのサーバーの最初のホストと同じIDが表示されます。 ? - 私はここで間違って何をやっているsshプロセスからのpidの読み取り異なるサーバーからのgrep出力

Killing pid - 18334... on host_1 
Killing pid - 18334... on host_2 
Killing pid - 18334... on host_3 

専門家:言い換えれば、それは新しいPIDを

for h in host1 host2 host3 
do 
    if [ $(hostname -s) = $h ]; then 
    PID=$(echo "`ps -ef | grep x_user | grep x_project | grep JMX_SCRIPT.PID=webservice | grep '/bin/bash' | awk '{print $2;}'`") 
    else 
    PID=$(ssh $h "echo \"`ps -ef | grep x_user | grep x_project | grep JMX_SCRIPT.PID=webservice | grep '/bin/bash' | awk '{print $2;}'`\"") 
    fi 

    echo "Killing pid - $PID... on $h" 
    sleep 5 
done 

出力として到来を更新しませんかあなたの助けを前にありがとう。

+0

Linuxシステムを使用していますか? – codeforester

答えて

0

問題があなたのsshコマンドである:

PID=$(ssh $h "echo \"`ps -ef | grep x_user | grep x_project | grep JMX_SCRIPT.PID=webservice | grep '/bin/bash' | awk '{print $2;}'`\"") 

ps -ef ...一部ではなく、リモートのものよりも、ローカルホスト上で実行されています。だから毎回同じPIDを得ているのです。

ファイルまたは文字列にコマンドパイプラインを格納し、sshに入力することでこれを解決できます。

+0

ファイルからコマンドを読んで、それを 'ssh'に単一の文字列として提供するか、最初に配列内のコマンドを読み込み、' ssh'コマンドでその配列を展開しますか? – Fred

+0

文字列の方法がうまくいくかどうかわかりません。チャールズ・ダフィーが私がheredocを勧めていたこのようなssh質問に似た解決策を与えてくれたので、私はこれを言っています。私は彼の答えを取り除いた - 彼は彼のアプローチをテストしたと思った、それは動作しませんでした。 – codeforester

+1

私は小さなおもちゃのようなテストを行いましたが、それは機能しました(シングルストリングのアプローチ)が、私は権威あることには問題はなく、リモート側の引用の問題はないと言うことはできません。私が提案した配列ベースのソリューションは、あなたが得る可能性があるので、(私の限られた知識のために)弾丸として証明されており、引用符で囲まれたサイドステップを可能にするためにファイルにコードを入れる必要はありません。私はスクリプト内のすべてのコードを保持する方がはるかに好きです。 – Fred

0

あなたの問題は引用から来ています。引用符を引用するのは難しいですし、したいことをする最善の方法は、しばしば引用符の中身を完全に引用することをやめることです。このようにそれを実行し、その後

declare -a remote_command=() 
remote_command+=(ps -ef '|' grep x_user '|' grep x_project '|') 
remote_command+=(grep JMX_SCRIPT.PID=webservice '|' grep '/bin/bash') 
remote_command+=('|' awk '{print $2;}') 

まず、配列内のリモートコマンドを入れ

PID="$(ssh $h "${remote_command[@]}")" 

アレイの拡張はつまり、あなたが必要なものを行う個別の引数を提供しますが、展開や単語の分割を行わずに特に、 "パイプ"シンボル(|)はローカルでは解釈されませんが、sshコマンドに引数として渡され、パイプとして遠隔解釈されます。

ところで、このテクニックの利点の1つは、コマンドがプログラムで構築されているため、単純なifブロック(例:+=ステートメント)を含むか含まないかを選択することができますエラーが発生しやすい引用の問題。

関連する問題