
Ich führe einen Befehl zur Dateisystemnutzung aus, um /var
eine Dateisystemnutzung über 80 % von einem Host auf mehreren Remote-Hosts zu erkennen.
Mein Befehl läuft einwandfrei ( df -h /var | awk '$1 > 80'
), aber ssh
er verursacht Syntaxfehler.
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
Antwort1
Das Problem besteht darin, dass $4
im awk
Programm Teil einer Zeichenfolge in doppelten Anführungszeichen ist. Da es in doppelten Anführungszeichen steht, wird die (lokale) Shell es erweitern, bevor es aufgerufen wird ssh
.
In der Shell $4
ist dies der vierte Positionsparameter, der höchstwahrscheinlich leer ist. Das bedeutet, dass $4
im awk
Code durch eine leere Zeichenfolge ersetzt wird, wodurch ein ungültiges awk
Programm entsteht.
In diesem Fall ist es nicht notwendig, den Befehl auf dem Remote-Host auszuführen awk
. Führen Sie stattdessen einfach Folgendes aus:
while IFS= read -r remote; do
ssh -n -o BatchMode=yes "$remote" 'df /var' | awk 'FNR == 2 && $5 > 80'
done </etc/gridhosts
awk
Beachten Sie, dass ich den Code so geändert habe, dass $5
in Zeile 2 nach at gesucht wird, anstatt $4
in jeder Zeile nach at, da sich hier normalerweise der Prozentsatz befindet. Außerdem habe ich die -h
Option for entfernt df
, da sie nicht benötigt wird, und ich habe die Schleife so eingestellt, dass sie die Eingabedatei Zeile für Zeile liest, anstatt den gesamten Inhalt der Datei in einem for
Schleifenkopf zu erweitern (was unelegant ist und im Allgemeinen unnötig viel Speicher verbrauchen könnte).
Möglicherweise möchten Sie auch Ansible oder eine ähnliche Software testen, da dies clusterweite Vorgänge erheblich vereinfachen würde.