이 스크립트가 반환하는 오류 유형(500,503,402 등)을 캡처하여 메시지에 추가하도록 하려면 어떻게 해야 합니까?
#!/bin/bash
hostlist=(s-colin.coverhound.us s-joe.coverhound.us)
for host in "${hostlist[@]}"; do
if nc -w 2 -z $host 80; then
echo "INFO: ssh on $host responding [Looks Good]"
else
echo "ERROR: ssh on $host not responding[Ooops something went
wrong]"
fi
done
답변1
현재 스크립트는 HTTP 요청을 수행하지 않으므로 HTTP 응답이 없으므로 보고할 HTTP 결과 코드도 없습니다. nc -z
TCP 연결 설정을 시도한 후 즉시 종료되고 성공 여부를 알려줍니다. 적절한 HTTP 클라이언트는 이 작업을 수행하지 않습니다. 일단 TCP 연결이 설정되면 유효한 HTTP GET
또는 요청을 보내고 POST
이에 대한 서버의 응답을 기다린 다음 어떤 방식으로든 이를 사용자에게 다시 보고합니다.
예를 들어 연결을 성공적으로 curl
테스트 하려면 스크립트에 다른 작업을 추가해야 할 수도 있습니다 . nc
무엇을 테스트할지 정확히 명확하지는 않지만 일반적으로 확인하려는 것은 시작 페이지 가져오기가 작동하는지 여부입니다.
if curl -s http://$host/ >/dev/null; then
echo "INFO: fetching http://$host/ worked" >&2
else
rc=$?
echo "ERROR: fetching http://$host/ failed (curl exit code $rc)" >&2
exit $rc
fi
특정 HTTP 결과 코드를 반환하지 않는 실패 시나리오가 여전히 있으므로 거기에 넣고 싶지 않습니다. 꼭 필요하신 경우, curl
가능할 때 신고하시는 것이 어렵지 않습니다.
가장 중요한 것은 테스트 중인 내용과 전체 HTTP 트랜잭션이 네트워크 수준에서 어떻게 보이는지 이해해야 한다는 것입니다(테스트하려는 경우).
또한 진단 출력은 표준 오류(리디렉션됨 >&2
)로 전환됩니다.
쉘 스크립트에 올바른 네트워크 테스트 스크립트를 작성하는 것은 잘못될 수 있는 일이 너무 많기 때문에 자질구레한 일입니다. 물리적 네트워크 장치가 하나 이상 있습니까? 케이블이 연결되어 있나요? 네트워크로 가는 경로가 있나요? 원격 호스트의 이름을 확인할 수 있나요? 지정된 포트에 연결할 수 있나요? (현재 스크립트에서 이를 테스트합니다.) 해당 연결을 수신하는 항목이 예상 프로토콜을 따르나요? 간단한 요청을 처리할 수 있나요? 특정 중요한 요청을 처리합니까? 올바르게 처리되었습니까? 서버 측과 클라이언트 측에서 수신된 응답 결과가 우리의 기대와 일치했습니까? (예를 들어 백엔드에 데이터베이스 보유 상태가 있는 경우 현재 상태가 다른가요?오직우리가 테스트하고 있는 한 가지 측면이요? )
일반적인 성가심은 테스트 GET /static-page
하고 원하는 것을 찾지 못하는 것 입니다.진짜500 서버 오류를 반환하는 것이 효과가 있지만 POST /dynamic-content
페이로드 테스트는 자동화하기에는 너무 어렵거나 지루하므로 절대 수행하지 않습니다.