[Cascavel-pm] [OFF-TOPPIC] Consulta Unix

Márcio Lopes marciolop em yahoo.com.br
Quinta Agosto 17 18:50:19 PDT 2006


Valeu pessoal!!

Incrementei mais um pouco o problema, além de fazer modificações
necessárias.

Acho que estou para ingressar no mundo Perl ou Php.

Vamos ver se melhorou:



Será implementado um script no Digital Unix 4.0f, para fazer a coleta e
carregar dados em tabelas de um Oracle que não está instalado no servidor
Unix (este banco será acessado via DB-Link). Esses dados serão extraídos a
partir da execução de comando Unix (TOP por exemplo).



Teremos um script que fará a coleta e a carga das tabelas.



Esse script deve ser executado de 30 em 30 minutos, só nos servidores que
estão rodando determinado processo (nome do processo = nucleo1).



O comando TOP quando executado exibe os seguintes dados:



load averages:  0.89,  3.06,  3.28                              08:42:15

132 processes: 13 running, 68 sleeping, 51 idle

CPU states: 23.8% user,  0.0% nice, 18.0% system, 58.1% idle

Memory: Real: 478M/991M act/tot  Virtual: 618M/3072M use/tot  Free: 4936K



  PID USERNAME PRI NICE  SIZE   RES STATE   TIME    CPU COMMAND

11038 root      44    0  508M 9150K sleep 175:54 13.90% acumula

17482 root      42    0  198M   33M sleep 214:11  2.90% iccp

19332 root      44    0  181M 2547K sleep  56:33  2.80% calcnuc

 4827 root      42    0  199M   20M run    63:52  2.30% exploracion

 9408 root      44    0 6064K 1933K sleep  42:45  1.60% gestred

12316 root      42    0  712M   60M run    44:41  0.60% nucleo

17812 root      42    0  182M 3088K run    14:21  0.60% supervision

  122 root      44    0  130M  131K sleep  76.7H  0.40% perroGuardaBIN

  824 root      44    0   14M 2318K sleep  20.2H  0.40% Xdec

16914 root      44    0 2944K  671K run     0:00  0.10% top

19381 root      44    0  182M 3252K sleep   2:25  0.10% enlace

 2691 root      42    0  198M   13M sleep   0:17  0.10% sinop

 8759 root      44    0 5544K 1327K run    19:57  0.00% distbdol

17954 root      42    0  196M 5808K run     4:59  0.00% ggestor

17153 root      42    0  195M 4374K run     4:28  0.00% ggestor



As tabelas que serão carregadas serão as seguintes:

(*) - Primary Key



MEDICAO_SERVIDORES

·        Servidor (*)

·        DataHora (*)

·        CPU_Usuario

·        CPU_Nice

·        CPU_Sistema

·        CPU_Livre

·        MEM_Real_Total

·        MEM_Real_Ativa

·        MEM_Virtual_Total

·        MEM_Virtual_Usada

·        MEM_Livre





PROCESSOS_SERVIDORES

·        Servidor (*)

·        DataHora (*)

·        Processo (*)

·        CPU

            ·        Tamanho



Acho que assim fica mais organizado. Pensei e cheguei neste enunciado.

Melhorou?



Abraços!



Márcio Lopes.

----- Original Message -----
From: "Luis Motta Campos" <monsieur_champs em yahoo.com.br>
To: "Cascavel Perl Mongers" <cascavel-pm em pm.org>
Cc: "Márcio Lopes" <marciolop em yahoo.com.br>
Sent: Thursday, August 17, 2006 7:02 AM
Subject: Re: [Cascavel-pm] [OFF-TOPPIC] Consulta Unix


>   Igor, Márcio, aqui tem um rascunho do que eu acho que deveria ser o
> programa.
>
>   Márcio, Perl é muito mais flexível para construir este tipo de solução
> do que o SQL*Loader + Shell Script.
>
>   Espero que o pessoal da lista ajude completando os brancos do
> programa, eu não tenho tempo para terminar de escrever. Mas não deve ser
> complicado, agora.
>
>   Putamplexos, e boa sorte.
>
> Igor Sutton wrote:
> >> 1- Preciso ter em uma tabela Oracle, para consultas (PL/SQL)
> >> eventuais, as
> >> informações de uso de memória, uso de cpu e dos 5 processos que estão
> >> consumindo mais recursos (no momento da coleta) de determinado servidor
> >> Unix;
> >>
> >
> > Perfeito, isso você deve saber melhor que eu :-)
> >
> > 2- A coleta dessas informações deve acontecer em períodos de tempo
> >> determinados (de 30 em 30 minutos, por exemplo);
> >>
> >
> > O cron resolve este problema.
> >
> > 3- Antes de fazer a coleta das informações é necessário saber se um
> > processo
> >> X está rodando no servidor, caso não esteja, não é necessário fazer a
> >> coleta.
> >>
> >
> > Proc::ProcessTable vem a calhar aqui.
> >
> > use List::Util;
> > use Proc::ProcessTable;
> >
> > my $p = Proc::ProcessTable->new;
> >
> > if (first { $_->fname eq 'meuprocesso' } @{$p->table}) {
> > ...
> > }
> >
> > 4- Preciso dispor as informações em colunas (Coleta, Data_Hora, Cpu,
> >> Memória, Processo1, Processo2, Processo3, Processo4, Processo5) da
tabela
> >> Oracle. Por exemplo:
> >>      *COLETA* *DATA_HORA* *CPU* *MEMÓRIA* *PROCESSO_1* *PROCESSO_2* *
> >> PROCESSO_3* *PROCESSO_4* *PROCESSO_5* coleta1 15/8/2006 18:30 60% 70% x
y
> >> z a b coleta2 15/8/2006 19:00 50% 80% y a z x b coleta3 15/8/2006 19:30
> >> 70% 85% a b z y x coleta4 15/8/2006 20:00 30% 40% b y x a z
> >>
> >
> > Isso você faz a inserção via DBI (OK, você pode ser mais tosco
executando o
> > binário do Oracle, porém tente o DBI antes). 'perldoc DBI' para esse
caso.
> >
> > 5- A cada coleta devo importar os dados resultantes da mesma, na tabela
> >> Oracle (a cada 30 minutos terei uma nova tupla na tabela).
> >> coleta1    16/8/2006 20:30    50%    60%    s    j    f    c    k
> >>
> >
> > CPU e Memória são o total sendo utilizado no seu servidor no momento ou
o
> > total utilizado por este cinco processos? Você tem o nome deste cinco
> > processos já?
> >
> > # separamos  todos os processos cujo nomes sejam aqueles que queremos
> > my @processos = grep { $_->fname =~ m/^(?:a|b|c|d|e) } @{$p->table};
> >
> > # somamos a cpu utilizada
> > my $cpu_usada = 0;
> > $cpu_usada += $_->pctcpu for (@processos);
> >
> > Caso você não saiba o nome dos processos, você pode verificar o PID do
> > processo que os gera e localizar todos os processos cujo PPID (Parent
PID)
> > sejam igual àquele que você coletou.
> >
> > O grande X da questão é: Como fazer essas coletas e importar essas
> >> informações para a tabela do Oracle (o Oracle está instalado no mesmo
> >> servidor onde será feita a coleta).
> >>
> >
> > No final das contas Proc::ProcessTable e DBI podem fazer exatamente o
que
> > você quer. Se você estiver impedido de utilizar DBI por qualquer motivo,
> > você pode substituí-lo por um pipe para o seu comando 'sql':
> >
> > <code>
> > # veja que eu não sei quais são os parâmetros para o seu programa, porém
> > # você deve utilizá-lo como na linha de comando.
> > open my $sql, "| /usr/bin/sql -Uusuario -Psenha" or die $!;
> >
> > print $sql "INSERT INTO oracle (cpu, memoria, proc1, proc2, proc3,
proc4,
> > proc5) VALUES ($cpu_usada, $memoria_usada, "$proc1", "$proc2", "$proc3",
> > "$proc4", "$proc5");\n";
> >
> > close $sql or warn $!;
> > </code>
> >
> > Saiba que este modo de interação com o banco de dados é um 'quick and
dirty
> > hack', e não deve ser usado como primeiro recurso.
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Cascavel-pm mailing list
> > Cascavel-pm em pm.org
> > http://mail.pm.org/mailman/listinfo/cascavel-pm
>
>
> --
> =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
>  Luis Motta Campos is Software Engineer, Oracle OCP/DBA, Un*x
>  Sysadmin, Member of {Lisbon,São Paulo,Cascavel,Brasil,London}
>  Perl Mongers and Perl Fanatic Evangelist
> =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
>


----------------------------------------------------------------------------
----


> #!/usr/bin/perl
> use warnings;
> use strict;
> use Proc::ProcessTable;
> use DBI;
>
> =head1 NAME read_process
>
> read_process - A command-line utility to account process usage for some
> processes using Oracle database as backend.
>
> =head1 SYNOPSIS
>
>   read_process
>
> =head1 DESCRIPTION
>
> This is a command-line utility to account process cpu/memory usage to an
oracle
> database table. It was made on demand to mr. Márcio Lopes, as a first
attempt
> to solve his problem at the company.
>
> =head1 CONFIGURATION
>
> Our script is simple, and we need as less configuration information as we
can.
> The existing configuration is somewhat hard-wired, but it can be easyly
> replaced by a full-expanded configuration object or something like. I
> personally recommend AppConfig.
>
> =head2 Database Configuration Section
>
> =head3 C<driver>
>
> This is the DBI database driver to use on connecting to the database. See
more
> about this in L<DBI> and L<DBD::Oracle>. Default value: 'dbi:Oracle'.
>
> =head3 C<user>
>
> The username to use on connecting to the database. Please replace this
with
> something useful. There is no acceptable default value.
>
> =head3 C<passwd>
>
> This is quite irregular, but this script is meant to run stand-alone,
> unattended, on a cron-tab. So it needs to know a password to authenticate
on
> the database. There is no default value for this configuration key. Please
fill
> in as appropriated.
>
> =head3 C<host>
>
> The database host name. As a matter of flexibility, its possible to run
this
> script on a different machine than the one that holds the database.
Because
> this software is an ethernal information producer, this could be
considered
> useful as the main database fills in and you will need to decide what to
do
> with de information... default: '127.0.0.1' (localhost).
>
> =head2 Processes to Monitor Configuration Section
>
> This section lists the process to monitor and gives any configuration
needed by
> the L<Proc::ProcessTable>.
>
> =head3 C<list>
>
> This is a list of process names that must be monitored.
>
> =cut
>
> our $config = {
>   database => {
>     driver => 'dbi:Oracle',
>     user   => 'process_accounter',
>     passwd => 's3cr3t',
>     host   => '127.0.0.1',
>   },
>   process => {
>     list => [],
>   }
> };
>
> =head1 FUNCTIONS
>
> =head2 C<connect>
>
> Stablished a connection to the database. Receives a configuration hash as
> parameter. Dies with an error message in case of failure. Returns a
database
> handler in case of success.
>
> =cut
>
> sub connect{
>   my $config = shift;
>   my $dbh = DBI->connect( q{$config->{driver};host=$config->{host}},
>                           $config->{user},
>                           $config->{passwd},
>                           { AutoCommit => 1, RaiseError => 1 }
>                         );
>   die $DBI:errstr unless $dbh;
>   return $dbh;
> }
>
> =head2 C<disconnect>
>
> Cuts off the database connection. This is a good programming practice to
close
> the connections used so the Oracle database can claim the allocated
resources
> back.
>
> Receives the database handler as first parameter. Returns nothing.
>
> =cut
>
> sub disconnect{
>   my $dbh = shift;
>   $dbh->disconnect;
> }
>
> =head2 C<search_process>
>
> Gets information about the process list you need to monitor. Returns a
hash
> table with the collected information.
>
> Receives a configuration hash as parameter.
>
> =cut
>
> sub search_process{}
>
> =head2 C<write>
>
> Writes the hash table with monitored process information into the
database.
> Receives a database handler as first parameter, and a process information
hash
> as second. Returns success or dies for errors.
>
> =cut
>
> sub write{}
>
> =head1 AUTHOR
>
> Luis Motta Campos is Senior System Engineer at Segula Tenologia e
Engenharia
> Portugal, and serves as part-time Ogre on the Cascavel Perl Mongers and
São
> Paulo Perl Mongers lists.
>
> Mail: monsieur_champs em segula.pt
>
> =head1 LICENSE
>
> This program is free software; you can redistribute it and/or modify it
under
> the terms of the GNU General Public License as published by the Free
Software
> Foundation; either version 2 of the License, or (at your option) any later
> version.
>
> This program is distributed in the hope that it will be useful, but
WITHOUT ANY
> WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A
> PARTICULAR PURPOSE.  See the GNU General Public License for more details.
>
> You should have received a copy of the GNU General Public License along
with
> this program; if not, write to the Free Software Foundation, Inc., 51
Franklin
> St, Fifth Floor, Boston, MA  02110-1301  USA
>
> =cut
>
> __END__
>


	

	
		
_______________________________________________________ 
Você quer respostas para suas perguntas? Ou você sabe muito e quer compartilhar seu conhecimento? Experimente o Yahoo! Respostas !
http://br.answers.yahoo.com/


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