[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