Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.39.16] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Всем привет.
FreeBSD (Apache+Perl) Есть скрипт, работающий бесконечно в качестве веб-сервера (использую use HTTP::Daemon;) запускаю его. минут через 5 слетает. в логах: [Fri Mar 12 13:50:18 2010] [warn] [client х.х.х.х] Timeout waiting for output from CGI script /usr/home/lexa/cgi-bin/proba.pl подскажите пожалуйста что это? и как исправить? |
Сообщ.
#2
,
|
|
|
А до того, в течение 5 минут, всё работает?
Добавлено А вообще телепатия говорит о том, что cgi -- это не реверс-прокси, нужное для http-демона. |
Сообщ.
#3
,
|
|
|
Цитата А до того, в течение 5 минут, всё работает? да. Обрабатывает он в данный момент клиентов или нет - все равно слетает. Цитата да. не правильно изложил мысль.А вообще телепатия говорит о том, что cgi -- это не реверс-прокси, нужное для http-демона. Вобщем у меня обычный прокси-сервер написанный на Perl Жду помощи |
Сообщ.
#4
,
|
|
|
Можно как-то конкретней?
Одна строчка лога - это красиво и кратко. Но хотелось бы увидеть и сам скрипт. |
Сообщ.
#5
,
|
|
|
пробую этот скрипт:
#!/usr/bin/perl use HTTP::Daemon; use LWP::UserAgent; use CGI::Carp qw(fatalsToBrowser); use Net::hostent; my $port = 4323; $SIG{PIPE} = 'IGNORE'; my $server = HTTP::Daemon->new( LocalPort => $port ) or die "Can't start server ($@)" unless defined $server; my $ua = LWP::UserAgent->new; while (my $connection = $server->accept) { #... тут ничего нет. Это для теста. } лог: [Mon Mar 15 05:34:07 2010] [warn] [client х.х.х.х] Timeout waiting for output from CGI script /usr/home/lexa/cgi-bin/proba.pl [Mon Mar 15 05:34:07 2010] [error] [client х.х.х.х] Premature end of script headers: proba.pl |
Сообщ.
#6
,
|
|
|
Далеко не гуру, но...
Это топорный код, имхо. Я, может быть и не прав, но взгляните на этот код: #!/home/merlyn/bin/perl -Tw use strict; $ENV{PATH} = join ":", qw(/usr/ucb /bin /usr/bin); $|++; ## Copyright (c) 1996 by Randal L. Schwartz ## This program is free software; you can redistribute it ## and/or modify it under the same terms as Perl itself. ## Anonymous HTTP proxy (handles http:, gopher:, ftp:) ## requires LWP 5.04 or later my $HOST = "localhost"; my $PORT = "8008"; sub prefix { my $now = localtime; join "", map { "[$now] [${$}] $_\n" } split /\n/, join "", @_; } $SIG{__WARN__} = sub { warn prefix @_ }; $SIG{__DIE__} = sub { die prefix @_ }; $SIG{CLD} = $SIG{CHLD} = sub { wait; }; my $AGENT; # global user agent (for efficiency) BEGIN { use LWP::UserAgent; @MyAgent::ISA = qw(LWP::UserAgent); # set inheritance $AGENT = MyAgent->new; $AGENT->agent("anon/0.07"); $AGENT->env_proxy; } sub MyAgent::redirect_ok { 0 } # redirects should pass through { ### MAIN ### use HTTP::Daemon; my $master = new HTTP::Daemon LocalAddr => $HOST, LocalPort => $PORT; warn "set your proxy to <URL:", $master->url, ">"; my $slave; &handle_connection($slave) while $slave = $master->accept; exit 0; } ### END MAIN ### sub handle_connection { my $connection = shift; # HTTP::Daemon::ClientConn my $pid = fork; if ($pid) { # spawn OK, and I'm the parent close $connection; return; } ## spawn failed, or I'm a good child my $request = $connection->get_request; if (defined($request)) { my $response = &fetch_request($request); $connection->send_response($response); close $connection; } exit 0 if defined $pid; # exit if I'm a good child with a good parent } sub fetch_request { my $request = shift; # HTTP::Request use HTTP::Response; my $url = $request->url; warn "fetching $url"; if ($url->scheme !~ /^(http|gopher|ftp)$/) { my $res = HTTP::Response->new(403, "Forbidden"); $res->content("bad scheme: @{[$url->scheme]}\n"); $res; } elsif (not $url->rel->netloc) { my $res = HTTP::Response->new(403, "Forbidden"); $res->content("relative URL not permitted\n"); $res; } else { &fetch_validated_request($request); } } sub fetch_validated_request { my $request = shift; # HTTP::Request ## uses global $AGENT ## warn "orig request: <<<", $request->headers_as_string, ">>>"; $request->remove_header(qw(User-Agent From Referer Cookie)); ## warn "anon request: <<<", $request->headers_as_string, ">>>"; my $response = $AGENT->request($request); ## warn "orig response: <<<", $response->headers_as_string, ">>>"; $response->remove_header(qw(Set-Cookie)); ## warn "anon response: <<<", $response->headers_as_string, ">>>"; $response; } И вот еще пример. Просто в вашем коде я не вижу никаких обработок, никаких форков =) |
Сообщ.
#7
,
|
|
|
Цитата Nadz Goldman @ Просто в вашем коде я не вижу никаких обработок, никаких форков =) ну да..убрал пока все лишнее..но слетать то он в таком виде не должен! верно? спасибо за примеры, возможно переделаю однако вопрос по моему коду все-равно остается открытым. очень хочется докопаться до истины..может с настройками FreeBSD или Perl проблема?!. |
Сообщ.
#8
,
|
|
|
Нет. ОС дает вам ресурсы, а вы просто ресурсы неправильно отрабатываете =)
Т.е. если это - прокси-сервер, то он работать... кхм... должен, но нииизэээнькооо-нииизэээнькооо =) Завтра/послезавтра обещаю покопаться. |
Сообщ.
#9
,
|
|
|
Nadz Goldman, ваш скрипт слетает точно так же
Чтож такое то ?? |
Сообщ.
#10
,
|
|
|
Если я правильно понял (это ведь был лог апача?) - то ты всё-таки пытаешься запускать эти скрипты из под апача, как CGI?
Это не CGI, а "самостоятельные" скрипты. CGI скрипт должен обработать запрос, вернуть апачу то, что нужно отослать клиенту и умереть, а не висеть в бесконечном цикле. Если он цепляется за жизнь, то апач его прибивает. |
Сообщ.
#11
,
|
|
|
Цитата Adil @ Если я правильно понял (это ведь был лог апача?) - то ты всё-таки пытаешься запускать эти скрипты из под апача, как CGI? Это не CGI, а "самостоятельные" скрипты. CGI скрипт должен обработать запрос, вернуть апачу то, что нужно отослать клиенту и умереть, а не висеть в бесконечном цикле. Если он цепляется за жизнь, то апач его прибивает. а как быть? мне нужно запустить скрипт и чтоб он висел постоянно. |
Сообщ.
#12
,
|
|
|
Цитата Lexa F. @ Просто его запустить. Из консоли, например мне нужно запустить скрипт и чтоб он висел постоянно. Добавлено Можно с & в конце команды, чтобы отлучить его от текущей консоли. |
Сообщ.
#13
,
|
|
|
запускаю putty, захожу в каталог со скриптом, запускаю: ./proba.pl
висит 5 мин и слетает . как еще можно попробовать запустить? и можно пример с & ? |
Сообщ.
#14
,
|
|
|
Может у тебя и ssh (или к кому там поключаешься) отключает за бездействие? Посмотри в его логах. И ты, кстати, так и не ответил, чей это был лог.
localhost#./proba.pl& |
Сообщ.
#15
,
|
|
|
Цитата Adil @ И ты, кстати, так и не ответил, чей это был лог. да. лог был апача спасибо, сейчас попробую ваш вариант |