
Я запускаю команду использования файловой системы, чтобы обнаружить /var
использование файловой системы свыше 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
Обратите внимание, что я изменил awk
код, чтобы он смотрел $5
на строку 2, а не на $4
каждую строку, так как именно там обычно находится процент. Кроме того, я удалил опцию -h
for, df
так как она не нужна, и заставил цикл читать входной файл построчно, а не разворачивать все содержимое файла в for
заголовке цикла (что неэлегантно и может, в общем случае, съедать много памяти без необходимости).
Вас также может заинтересовать Ansible или аналогичное программное обеспечение, поскольку оно значительно упростит выполнение операций в масштабах всего кластера.