/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
의미 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 옵션 은 필요하지 않았기 때문에 제거했고 , 루프 헤더에서 파일의 전체 내용을 확장하는 대신 루프가 입력 파일을 한 줄씩 읽도록 했습니다 (이는 우아하지 않고 루프에서 작동하지 않습니다). 일반적인 경우 메모리를 많이 소모하게 됩니다.)$5
$4
-h
df
for
또한 클러스터 전체 작업을 훨씬 쉽게 만들 수 있는 Ansible 또는 유사한 소프트웨어를 평가하는 데 관심이 있을 수도 있습니다.