Возникла необходимость проверить из консоли работу 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-файлами, об этом читать здесь.