web-dev-qa-db-ja.com

bash setenv変数がpdshで機能していません

PDSHを使用して、1つのコマンドラインから複数のサーバーを制御しています。

以下のコマンドは個々のサーバーで正常に機能しますが、PDSH内でexportコマンドを入力すると、エコーバックが空になります。

これがなぜであるか、またはそれを修正する方法についてのアイデアはありますか?

具体例:

これは問題なく機能します。

# export CRAWL_DATE=$(date +%Y%m%d);
# echo $CRAWL_DATE
20131206

ただし、PDSHでは、空白の値がエコーされます。

pdsh> export CRAWL_DATE=$(date +%Y%m%d);
pdsh> echo $CRAWL_DATE;
<IP 1>: 
<IP 2>:
3
d-_-b

次のコマンドを実行すると、正常に機能しているように見えます。

$ pdsh -w root@skinner,root@mulder \
    'export CRAWL_DATE=$(date +%Y%m%d); echo $CRAWL_DATE;'
skinner: 20131206
mulder: 20131206

あなたが説明しているように実行すると、これが示されます:

$ pdsh -w root@skinner,root@mulder
pdsh> export CRAWL_DATE=$(date +%Y%m%d);
pdsh> echo $CRAWL_DATE;
skinner: 
mulder: 

ただし、この方法で実行すると機能します。

pdsh> export CRAWL_DATE=$(date +%Y%m%d); echo $CRAWL_DATE;
skinner: 20131206
mulder: 20131206

では、なぜ方法2が機能しなかったのでしょうか。

考えられる理由は、pdshでコマンドを実行し、returnキーを押すたびに、そのコマンドが各ホストでsshを介して実行されるためです。次に実行されるコマンドは、シェルが異なるまったく異なるsshセッションで実行されるため、変数は存在しません。

2011年に提出されたこの問題は、私の結論に信憑性を与えていると思います。 問題37:pdshでユーザー定義変数をサポート

その号で言及された興味深い回避策がありました、主に:

$ pdsh -w ^hostfile -Rexec ssh -2 -l %u %h '. ~/.pdsh/vars/%h; command'

このメソッドは、変数を含むファイルを利用し、各コマンドはこのファイルをソースできます。. ~/.pdsh/vars/%hコマンドがリモートで実行されるたび。

4
slm