我正在运行文件系统使用命令来检测/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
是双引号字符串的一部分。由于它用双引号引起来,(本地)shell 将在调用之前展开它ssh
。
在 shell 中,$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
每一行查看,因为这是百分比通常所在的位置。另外,我删除了 for-h
选项,df
因为不需要它,并且我让循环逐行读取输入文件,而不是在for
循环头中扩展文件的完整内容(这是不优雅的,并且可以在一般情况下,不必要地消耗大量内存)。
您可能还对评估 Ansible 或类似软件感兴趣,因为这将使集群范围的操作变得更加容易。