호스트가 살아 있는지 확인하기위한 쉘 명령 / 스크립트? 모두에서 작동 할

쉘 명령 (주로 bash) 만 사용하여 주어진 호스트가 작동하는지 확인하는 더 많은 방법을 찾으려고합니다. 이상적으로는 호스트 이름과 IP 주소 모두에서 작동 할 수 있습니다. 현재 내가 아는 유일한 방법은 핑이며, 여기에 설명 된 것처럼 스크립트에 통합되었을 수 있습니다. 다른 아이디어가 있습니까?



답변

ping 이다 호스트가 살아 있고 연결되어 있는지 여부를 테스트하는 방법은. (호스트가 활성 상태이지만 연결이 끊어 지거나 응답 속도가 느리면 호스트와 죽은 호스트를 구분할 수 없습니다.)

ping명령이 지원하는 옵션 은 시스템마다 다릅니다. 당신은 그것이 영원히 반복되지 않지만 응답을받지 못하면 몇 초 후에 반환되도록하고 싶을 것입니다.

FreeBSD 및 Linux iputils를 사용하면 ping -c 1 -W 1 >/dev/null단일 핑을 보내고 1 초 동안 기다립니다. 출력을 구문 분석 할 필요가 없습니다. 명령이 핑 백을 수신하면 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

답변

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문제가있는 포트의 대상에 도달하면 연결되어 있지 않고 연결을 끊지 않습니다. 스크립트에서 중단 될 수 있습니다.

그렇게 깨끗하지는 않지만 timeoutand 및 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