Проверка работы HTTP-сервера с помощью telnet.

Возникла необходимость проверить из консоли работу HTTP сервера:

Начнем:

$ telnet mail.ru 80
Trying 194.67.57.26...
Connected to mail.ru.
Escape character is '^]'.
HEAD / HTTP/1.0
Host: mail.ru         "тут надо два раза нажать Enter"

HTTP/1.0 200 OK
Date: Fri, 12 Dec 2008 06:00:08 GMT
Server: Apache/1.3.27 (Unix) mru_xml/0.471 gorgona/2.1 mod_jk/1.2.4 mod_ruby/1.0.7 Ruby/1.6.8 mod_mrim/0.17
Connection: close
Content-Type: text/html; charset=windows-1251
Content-Length: 94350
Set-Cookie: Mpopl=95482732; expires=Fri, 12 Dec 2008 06:15:08 GMT; path=/; domain=.mail.ru
Set-Cookie: mrcu=B8A34941FDE80C3792850AD6B051; expires=Mon, 10 Dec 2018 06:00:08 GMT; path=/; domain=.mail.ru
Cache-Control: no-cache,no-store,must-revalidate
Pragma: no-cache
Expires: Thu, 13 Dec 2007 06:00:08 GMT
Last-Modified: Fri, 12 Dec 2008 09:00:08 GMT

Connection closed by foreign host.

Ага теперь посмотрим html код главной страницы:

$  telnet r-info.net 80
Trying 77.221.154.202...
Connected to r-info.net.
Escape character is '^]'.

GET / HTTP/1.0
Host: r-info.net       "тут надо два раза нажать Enter"               

Server: nginx/0.6.32
Date: Fri, 12 Dec 2008 06:56:09 GMT
Content-Type: text/html
Connection: close
Last-Modified: Sat, 01 Nov 2008 09:15:39 GMT
ETag: "5198437-d92-490c1e3b"
Accept-Ranges: bytes
Content-Length: 3474

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
 <head>
...............................
 </body>
<!-- REVISION: 1.4 -->
</html>

Connection closed by foreign host.

Теперь напишем скрипт для запуска через cron, который выдает ошибку (которая отправится на почту пользователю запустившему скрипт) в случае проблем с сервером. Этот скрипт разместим на сервере который будет наблюдать за нашим сервером.

    (sleep 2 && echo "HEAD / HTTP/1.0" && echo "Host: r-info.net" && echo && sleep 2) \
    | telnet r-info.net 80 2>/dev/null | grep "HTTP/.*\..* 200 OK" \
    | awk 'BEGIN{k=0}{if ($0~" 200 OK") k=1}END{if (k==0) print "Сервер r-info.net недоступен!" }'

Все.

P.S. После тестирования оказалась, что фокус со sleep не всегда проходит. В этом случае можно решить проблему с помощью утилитой expect. Создадим скрипт и сделаем его исполняемым:

$ cat r-info.net.expect
  #!/usr/local/bin/expect
  spawn /usr/bin/telnet r-info.net 80
  expect scape {send "HEAD / HTTP/1.0\r"}
  send "Host: r-info.net\r"
  send "\r"
  expect eof

Теперь можно воспользоваться предыдущим примером :

./r-info.net.expect \
 | telnet r-info.net 80 2>/dev/null | grep "HTTP/.*\..* 200 OK" \
 | awk 'BEGIN{k=0}{if ($0~" 200 OK") k=1}END{if (k==0) print "Сервер r-info.net недоступен!" }'

P.P.S. так же можно воспользоваться fifo-файлами, об этом читать здесь.

Leave a Reply