私はついに数週間苦労してきた問題を解決することができました。リモートでコマンドを実行するために、「承認されたキー」でSSHを使用します。whileループで実行する場合を除き、すべて問題ありません。ループは、sshコマンドでの反復を完了すると終了します。
長い間、これはある種のkshの奇妙さだと思っていましたが、bashが実際に同じように動作することを発見しました。
問題を再現する小さなサンプルプログラム。これは、スナップショットを取得し、クラスター内のノード間でスナップショットを複製する大規模な実装から抽出されます。
#!/bin/bash
set -x
IDTAG=".*zone"
MARKER="mark-$(date +%Y.%m.%d.%H.%M.%S)"
REMOTE_HOST=sol10-target
ZFSPARENT=rpool
ssh $REMOTE_HOST zfs list -t filesystem -rHo name,mounted $ZFSPARENT | grep "/$IDTAG " > /tmp/actionlist
#for RMT_FILESYSTEM in $(cat /tmp/actionlist)
cat /tmp/actionlist | while read RMT_FILESYSTEM ISMOUNTED
do
echo ${RMT_FILESYSTEM}@${MARKER}
[ "$ISMOUNTED" = "yes" ] && ssh $REMOTE_HOST zfs snapshot -r ${RMT_FILESYSTEM}@${MARKER}
echo Remote Command Return Code: $?
done
(zfsリストの「-H」オプションの動作の定義に従って、grep検索式にTAB文字があることに注意してください。)
私のサンプルには、ルートにいくつかのZFSファイルシステムがあり、すべての「ゾーン」が、次のような名前のデータセットにルートファイルシステムを持っています。
POOL / zones / app1zone
POOL / zones / group2 / app2zone
等
上記のループは、選択した各データセットのスナップショットを作成する必要がありますが、代わりに最初のループでのみ動作し、終了します。
プログラムが適切な数のデータセットを見つけたことは、スクリプトが存在した後に「/ tmp / actionlist」ファイルをチェックすることで簡単に確認できます。
sshコマンドがたとえばechoコマンドに置き換えられた場合、ループはすべての入力行を反復処理します。または私のお気に入り-問題のコマンドに「エコー」を追加します。
代わりにforループを使用した場合も機能しますが、データセットのリストの潜在的なサイズのために、コマンドラインの最大長に問題が生じる可能性があります。
私は、99.999%で、sshコマンドを含むループのみが問題を引き起こすと確信しています。
sshコマンドが実行される反復が完了することに注意してください!whileループに入力されたデータが突然失われるかのように...最初のいくつかの入力行がsshコマンドを実行しない場合、ループは実際にSSHコマンドを実行するまで続きます。
これをテストしている私のラップトップには、2つまたは3つのサンプルデータセットのみを含む2つのSolaris 10 VMがありますが、これは、これが稼働する予定の大規模なSPARCシステムでも発生しており、多くのデータセットがあります。
actionlist
。sshの標準入力を/dev/null