
/var
1 つのホストから複数のリモート ホストまでのファイルシステムの使用率が 80% を超えていることを検出するために、ファイルシステム使用率コマンドを実行しています。
コマンドは正常に実行されます ( 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
を参照するようにしたことに注意してください。これは、パーセンテージが通常配置される場所だからです。また、オプションは不要なので削除し、ループ ヘッダーでファイルの全内容を展開するのではなく (これは洗練されておらず、一般的には不必要に大量のメモリを消費する可能性があります)、ループが入力ファイルを1 行ずつ読み取るようにしました。$5
$4
-h
df
for
Ansible や同様のソフトウェアを評価することもお勧めします。これにより、クラスター全体の操作がはるかに簡単になります。