호스트가 활성 상태인지 확인하는 쉘 명령/스크립트는 무엇입니까?

호스트가 활성 상태인지 확인하는 쉘 명령/스크립트는 무엇입니까?

bash나는 단지 쉘 명령(주로 ) 을 사용하여 특정 호스트가 작동 중인지 확인하는 더 많은 방법을 찾으려고 노력하고 있습니다 . 이상적으로는 호스트 이름과 IP 주소를 모두 사용합니다. 현재 내가 아는 유일한 기본 방법은 ping이며 아마도 스크립트에 통합되었을 수도 있습니다.여기에 설명된 대로입니다.다른 아이디어가 있나요?

답변1

ping 호스트가 살아 있고 연결되어 있는지 테스트하는 방법입니다. (호스트가 활성화되어 있지만 연결이 끊어지거나 느리게 응답하는 경우에는 죽은 호스트와 구분할 수 없습니다.)

이 명령이 지원하는 옵션은 ping시스템마다 다릅니다. 영원히 반복되지 않고 응답을 받지 못한 채 몇 초 후에 반환되는지 확인해야 합니다.

FreeBSD 및 Linux iputil의 경우 ping -c 1 -W 1 >/dev/null단일 ping을 보내고 1초 동안 기다립니다. 출력을 구문 분석할 필요가 없습니다. 명령이 ping을 수신하면 0이 반환되고, 그렇지 않으면 0이 아닌 값이 반환됩니다(알 수 없는 호스트 이름, 호스트에 대한 경로 없음, 응답 없음). 일부 구현에는 다른 플래그가 필요할 수 있습니다(예: FreeBSD에는 -w없음 -W). 시스템 설명서를 확인하세요.

if ping -c 1 -W 1 "$hostname_or_ip_address"; then
  echo "$hostname_or_ip_address is alive"
else
  echo "$hostname_or_ip_address is pining for the fjords"
fi

답변2

Ping은 호스트가 네트워크에 연결되어 있는지 여부에 신속하게 응답하는 데 유용하지만 일반적으로 호스트가 활성 상태인지 또는 여전히 예상대로 작동하는지 알려주지는 않습니다. 이는 ping 응답이 일반적으로 커널에 의해 처리되기 때문입니다. 따라서 시스템의 모든 응용 프로그램이 충돌하더라도(예: 디스크 오류 또는 메모리 부족으로 인해) 일반적으로 여전히 ping 응답을 받고 시스템이 작동하지 않는다고 생각할 수 있습니다. 그 시간에 실행 중입니다. 상황이 정확히 반대일 경우에는 정상적으로 작동할 수 있습니다.

검사 서비스

호스트가 여전히 온라인 상태인지 여부는 별로 신경 쓰지 않는 경우가 많습니다. 실제로 관심을 두는 것은 컴퓨터가 여전히 일부 작업을 수행하고 있는지 여부입니다. 따라서 작업을 직접 확인할 수 있다면 호스트가 작동 중이고 작업이 계속 실행 중임을 알 수 있습니다.

예를 들어 웹 서버를 실행하는 원격 호스트의 경우 다음을 수행할 수 있습니다.

# Add the -f option to curl if server errors like HTTP 404 should fail too
if curl -I "http://$TARGET"; then
  echo "$TARGET alive and web site is up"
else
  echo "$TARGET offline or web server problem"
fi

SSH를 실행하고 비밀번호 없는 로그인 키를 설정하는 경우 다음과 같은 추가 옵션이 있습니다.

if ssh "$TARGET" true; then
  echo "$TARGET alive and accessible via SSH"
else
  echo "$TARGET offline or not accepting SSH logins"
fi

이는 호스트에 SSH로 연결하고 명령을 실행한 다음 연결을 닫는 방식으로 true수행 됩니다. ssh명령을 성공적으로 실행할 수 있는 경우에만 명령이 성공을 반환합니다.

SSH를 통한 원격 테스트

이를 확장하여 특정 프로세스를 확인할 수 있습니다. 예를 들어 해당 프로세스가 mysqld머신에서 실행 중인지 확인할 수 있습니다.

if ssh "$TARGET" bash -c 'ps aux | grep -q mysqld'; then
  echo "$TARGET alive and running MySQL"
else
  echo "$TARGET offline or MySQL crashed"
fi

물론 이 경우 monit서비스가 계속 실행되도록 대상에서 이와 같은 작업을 실행하는 것이 좋지만 (B 머신이 준비된 경우) 머신 A에서 특정 작업을 수행하려는 스크립트에서는 유용합니다.

rsync이는 작업을 수행하기 전에 대상 시스템에 특정 파일 시스템이 마운트되어 있는지 확인하여 어떤 이유로 보조 파일 시스템이 마운트되지 않은 경우 실수로 기본 디스크를 채우지 않도록 하는 것과 같을 수 있습니다 . 예를 들어, /mnt/raid계속하기 전에 대상 시스템에 설치되었는지 확인합니다 .

if ssh "$TARGET" bash -c 'mount | grep -q /mnt/raid'; then
  echo "$TARGET alive and filesystem ready to receive data"
else
  echo "$TARGET offline or filesystem not mounted"
fi

고객 서비스 없음

때로는 서비스에 연결하는 쉬운 방법이 없고 들어오는 TCP 연결을 수락하는지 확인하고 싶지만 telnet관련 포트의 대상에 연결하면 해당 포트는 그대로 있고 연결이 끊어지지 않습니다. 스크립트로 인해 중단됩니다.

아주 깨끗하지는 않지만 timeout및 프로그램 netcat의 도움으로 여전히 할 수 있습니다. 예를 들어 컴퓨터가 TCP 포트 445에서 SMB/CIFS 연결을 허용하는지 확인하므로 로그인 암호가 없거나 CIFS 클라이언트 도구가 실행되고 있지 않은 경우에도 Windows 파일 공유가 실행되고 있는지 확인할 수 있습니다. 설치하다:

# Wait 1 second to connect (-w 1) and if the total time (DNS lookups + connect
# time) reaches 5 seconds, assume the connection was successful and the remote
# host is waiting for us to send data.  Connecting on TCP port 445.
if echo 'x' | timeout --preserve-status 5 nc -w 1 "$TARGET" 445; then
  echo "$TARGET alive and CIFS service available"
else
  echo "$TARGET offline or CIFS unavailable"
fi

관련 정보