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

Igor Sutton igor.sutton em gmail.com
Quinta Agosto 17 02:37:49 PDT 2006


> 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.

-- 
Igor Sutton Lopes
t: +55 51 9627.0779
e: igor.sutton em gmail.com
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/cascavel-pm/attachments/20060817/94527005/attachment.html 


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