[Cascavel-pm] Gerenciando conexoes

Marco A P D'Andrade mdacwb em gmail.com
Sábado Janeiro 20 21:10:56 PST 2007


Cristiano,

Bem, devidamente explicada sua situação e dificuldades, já com as
sugestões do Nilson, seu questionamento me chamou a atenção, então
estou quebrando meu silêncio de férias ;)


O que vc precisa será basicamente extraído de aplicativos básicos do
*nix, e é claro... manipulado para produzir as informações relevantes:

ps -C httpd
- Lista todos os processos HTTPD (apache) ou outro que porventura seja
criado com o Kylix, isso vc terá de descobrir!

# ps -C httpd | head
  PID TTY          TIME CMD
 9011 ?        00:04:12 httpd
21582 ?        00:02:00 httpd
11717 ?        00:00:34 httpd
 1381 ?        00:01:30 httpd
 8005 ?        00:02:15 httpd


lsof -p <pid>
- Lista todos os filehandles abertos, sejam eles locais ou tcp, sendo
que lhe interessaria somente as conexões TCP:

# lsof -n -p 13581 | grep TCP
httpd   13581  web    6u  IPv4 631869262               TCP
200.x.y.z:59927->200.x.y.b:mysql (ESTABLISHED)
httpd   13581  web   20u  IPv4 525847182               TCP *:https (LISTEN)
httpd   13581  web   21u  IPv4 525847183               TCP *:http (LISTEN)

De resto, é fazer o código Perl propriamente...

Segue um esboço não testado...

#!/usr/bin/perl -w
#
use strict;
 my ( $pid, @pid, $mysql, $http );

  unless ( open(PS, "ps -C httpd |") ) {
      print "Falha ao abrir PS: $!\n";
      exit 1;
  }

  while ( defined( $_ = <PS> ) ) {
     ( $pid ) = /^\s+(\d+)\s+/;
     next unless ( $pid );

     unless ( open(LSOF, "lsof -p $pid | grep TCP") ) {
           print "Falha ao verificar open files para $pid: $!\n";
           next;
     }
     $http=0; $mysql=0;
     while ( defined( $_ = <LSOF> ) ) {
         if ( /:http/ ) {
            $http=1;
          } elsif ( /:mysql/ ) {
            $mysql=1;
         }
     }
     unless ( $mysql && $http ) {
          push(@pids, $pid);
      } else {
          $full++;
     }
   }

  if ( @pids ) {
     printf "Foram identificados %s processos sem acesso simultaneo e
%s em ambos.\n",
          scalar(@pids), $full;
   } else {
     printf "Foram identificados apenas %s processos, sem acesso a
banco!\n", $full;
  }

  exit 0;

#--------------

PS: Observe que utilizei mysql em vez de oracle, mas isto é apenas
para seguir o meu ambiente... não quiz acessar os servidores com que
usam banco oracle ... ;)

Outra abordagem, que pode ser mais interessante, seria vc listar todas
as conexões com seu banco de dados, e a partir disto identificar os
processos que as mantem:


# netstat -na | grep :3306 | grep ESTAB
 >> Lista todas as conexões de rede, isola somente os ips desejados,
conexões ativas tcp        0      0 200.x:59701        200.y:3306
   ESTABLISHED
tcp        0      0 200.x:59471        200.y:3306         ESTABLISHED
tcp        0      0 200.x:59459        200.y:3306         ESTABLISHED
tcp        0      0 200.x:59530        200.y:3306         ESTABLISHED
tcp        0      0 200.x:59574        200.y:3306         ESTABLISHED
tcp        0      0 200.x:59614        200.y:3306         ESTABLISHED
tcp        0      0 200.x:60223        200.y:3306         ESTABLISHED

root em webmail1(click21):~# fuser -n tcp 59701
  >> Verifica qual processo está utlizando a porta TCP localmente
59701/tcp:           13709

root em webmail1(click21):~# ps -p 13709
 >> responde QUAL é o processo
  PID TTY          TIME CMD
13709 ?        00:01:12 httpd


Bem, creio que já divaguei demais em administração e de menos em Perl,
mas a ideia é só ajudar né !

PS: sugiro também verificar na linguagem a existencia/uso de pool de
conexões com o banco, ou o encerramento pelo lado do servidor para
conexões inativas a partir de X minutos!


Sds,
Marco Antonio
Rio-PM


2007/1/20, Cristiano Torres <listas.perl em gmail.com>:
> Caros mestres, bom dia.
>
> Uma breve introdução desse humilde aprendiz, e claro uma solicitação de
> ajuda ou referência.
>
> Onde trabalho sou um dos responsáveis pela área de TI e configuração de
> servidores WEB. Basicamente configuro e
> monitoro servicos WEB para que a aplicacao desenvolvida pela empresa rode
> sem problemas. Porém recentemente
> começaram a desenvolver um modulo para apache ( desenvolveram em Kylix para
> versao 1.3.37 do Apache) que
> recebe as conexoes via http, processa a requisicao, abre conexao com oracle
> e retorna o resultado para o cliente.
>
>
> O que acontece é que esse modulo esta abrindo mais conexoes com o banco do
> que devia, e os malditos
> desenvolvedores em delphi disseram que a culpa é do servico web.
>
> Já mostrei para o pessoal que o apache só gerencia as requisicoes com a
> porta na qual o processo "escuta" (80),
> e que as outras conexoes deveriam ser gerenciadas pelo modulo/driver que
> eles utilizam. Fiz isso usando
> um modulo do CPAN "Apache::Scoreboard" (entao tive uma breve nocao do poder
> do perl)
>
>
> Bom, podem ficar tranquilos que não vim pedir ajuda em kylix ou em delphi,
> meu intuito é elaborar um programa
> que faça o seguinte, pegue o PID do processo do apache, se esse PID não
> tiver simultaneamente conexoes abertas
> na porta 80 e 1521 (porta do banco), que gere uma lista.
>
>
> Nao pretendo corrigir a falha do modulo do desenvolvimento, queria aprender
> como linguagens de
> programacao mais apropriadas lidam com isso, por isso peço uma referencia.
> Acho que
> para corrigir isso o ideal seria que trocassem o pessoal do desenvolvimento
>
>
> Comprei o Learning Perl, mas ainda estou apanhando um pouco.
>
> Se alguem poder dar uam dica para esse pequeno gafanhoto, agradeço.
>
> E desculpem pelo tamanho do e-mail
>
>
> Cristiano Torres
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>
>


Mais detalhes sobre a lista de discussão Cascavel-pm