/var
あるホストから複数のリモートホストまでのファイルシステム使用率が80%を超えるかどうかを検出するために、filesystem Usageコマンドを実行しています。
私のコマンドはうまく実行されますが、(df -h /var | awk '$1 > 80'
)ssh
構文エラーが発生します。
for i in `cat /etc/gridhosts`; do ssh -n -o BatchMode=yes ${i} "df -h /var | awk '$4 > 80'" ; done
awk: > 80
awk: ^ syntax error
awk: > 80
awk: ^ syntax error
awk: > 80
答え1
問題は、プログラムが二重引用符で囲まれた文字列の一部である$4
ことです。awk
二重引用符で囲まれているため、(デフォルト)シェルは呼び出す前に拡張しますssh
。
シェルでは、$4
これは4番目の位置パラメータであり、空にすることができます。これは、コードが空の文字列に置き換えられ、誤ったプログラムが生成されることを$4
意味awk
しますawk
。
awk
この場合、リモートホストでコマンドを実行する必要はありません。代わりに
while IFS= read -r remote; do
ssh -n -o BatchMode=yes "$remote" 'df /var' | awk 'FNR == 2 && $5 > 80'
done </etc/gridhosts
通常、パーセンテージが表示される場所なので、すべての行ではなく行2を表示するようにawk
コードを変更しました。また、forオプションは必要ないので削除し、ループヘッダーからファイルの内容全体を拡張する代わりに、ループに入力ファイルを1行ずつ読み込むようにしました(これはエレガントではなくループでは機能しません)。一般的な場合、メモリが大量に消費されます。)$5
$4
-h
df
for
また、クラスタ全体の操作をはるかに簡単にすることができるAnsibleまたは同様のソフトウェアを評価することに興味があるかもしれません。