쉘 스크립트가 한 줄에 머무르는 것을 방지

쉘 스크립트가 한 줄에 머무르는 것을 방지

나는 원격 서버의 디스크 활용도를 계산하는 데 도움이 되는 쉘 스크립트를 작성했습니다 df -h. 아래에 코드 조각을 포함합니다.

s_arch_1_per=`sshpass -p 'password' ssh root@server_ip_1 "df -h | grep '/Archive_1'| awk '{print $ (NF-1)}'"`

master_per=`sshpass -p 'password' ssh nidhal@server_ip_2 "df -h | grep '/dev/mapper/centos-root'| awk '{print $ (NF-1)}'"`

arch_5_per=`df -h | grep '/archive_1'| awk '{print $ (NF-1)}'`

df -h문제는 때로는 손상된 마운트 지점으로 인해 로컬 또는 원격 시스템 실행이 중단되어 전체 셸이 완전히 실행되지 않는다는 것입니다. 내 스크립트가 df -h이러한 시스템 중 하나에서 작동하지 않을 때 줄에 걸리는 것을 방지하려면 어떻게 해야 합니까? 줄을 실행하는 데 너무 오랜 시간이 걸리면 스크립트가 한 줄을 건너뛰고 다음 줄을 계속 진행하도록 하고 싶습니다.

답변1

df출력을 파이핑하는 대신 grep( df마운트된 모든 파일 시스템, 응답이 없는 파일 시스템(예: 중단된 NFS 마운트)도 쿼리하게 됨) df대신 원하는 정보를 파일 시스템에 인수로 제공합니다.

예를 들면 다음과 같습니다.

df -h | grep '/Archive_1

사용:

df -h /Archive_1

이제 마운트 지점에 대한 정보를 df얻으십시오 . /Archive_1장치 노드 또는 마운트 지점을 매개변수로 사용할 수 있습니다.

GNU df를 사용하면 --output원하는 것이 크기뿐이라면 해당 옵션을 사용할 수도 있습니다... 따라서 awk를 사용할 필요가 없습니다(sed 또는 다른 것을 사용하여 첫 번째 줄을 제거하십시오. 즉, GNU 이후로 헤더는 계속 작동합니다) df는 헤더 헤더 출력 옵션을 억제하지 않습니다). 예를 들어

df -h --output=size /Archive_1 | sed 1d

또한 백틱을 사용하면 안 됩니다.명령 대체. 그것들은 더 이상 사용되지 않으며 더 이상 사용되지 않습니다. 대신 사용하십시오 $().

전체적으로 보면 다음과 같습니다.

s_arch_1_per=$(sshpass -p 'password' ssh root@server_ip_1 \
                 'df -h --output=size /Archive_1 | sed 1d')

마지막으로 비밀번호 인증 대신 키 기반 SSH 인증을 사용해야 합니다. 그러나 그것은 또 다른 질문에 대한 대답입니다.


$그런데, 여전히 awk를 사용하고 싶거나 필요하다면 다음과 같이 필드 번호 앞의 모든 기호를 이스케이프해야 합니다 .\$ 큰따옴표 안에 있는 경우. \$(NF-1)예를 들어 $(NF-1).

쉘 인용은 PITA입니다. 특히 여러 수준의 인용을 수행해야 할 때(예를 들어 SSH를 통해 인용된 awk 스크립트를 원격 호스트로 보내는 경우) 더욱 그렇습니다.

바라보다공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?쉘 인용에 관한 다양하고 유용한 정보와 팁.

관련 정보