Exibindo o estado das conexões TCP no Linux

Em um post anterior apresentei um comando que exibia apenas o número de conexões ativas em um servidor/desktop Linux. Dessa vez apresento um comando que exibi o estado de todas as conexões:

$ netstat -a -n| sed '/^tcp/!d'|cut -c 68-|sort|uniq -c|sort -n

1 SYN_RECV
3 CLOSING
7 FIN_WAIT1
8 SYN_SENT
17 LISTEN
18 CLOSE_WAIT
18 FIN_WAIT2
656 TIME_WAIT
688 ESTABLISHED

No exemplo acima são exibidas as conexões de um servidor de e-mail.

Descobrindo qual ftp é o mais rápido

Imagine que você precisa baixar um arquivo e ao verificar descobre que existem vários mirrors que disponibilizam o mesmo arquivo. Por alguns segundos, você para e pensa “e agora? qual eu escolho?” Bem, de duas uma: ou vai no chute escolhendo qualquer um, ou começa a baixar e se verificar que está muito lento desiste e começa em outro mirror.

Pois bem, como diria o seu Creisson: Seus problemas acabaram! O comando netselect, efetua alguns testes de desempenho em endereços ftp passados como parâmetro.

# netselect -vv ftp.debian.org ftp.br.debian.org
Running netselect to choose 1 out of 2 addresses.
............
ftp.debian.org 177 ms 19 hops 90% ok ( 9/10) [ 568]
ftp.br.debian.org 9999 ms 30 hops 0% ok
568 ftp.debian.org

Existe também outro comando (para quem utiliza ubuntu/debian) que cria um arquivo sources.list (endereço dos repositórios para instalação/atualização de pacotes) baseando-se nos mirrors do próprio apt: netselect-apt

# netselect-apt
Using distribution stable.
Retrieving the list of mirrors from www.debian.org...
--22:06:36-- http://www.debian.org/mirror/mirrors_full
=> `mirrors_full'
Resolving www.debian.org... 194.109.137.218
Connecting to www.debian.org[194.109.137.218]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 165,115 [text/html]
100%[==========================================>] 165,115 65.38K/s
22:06:40 (65.27 KB/s) - `mirrors_full' saved [165115/165115]
>Choosing a main Debian mirror using netselect.
netselect: unknown host debian.mirror.cygnal.ca
netselect: unknown host cdn.mirror.garr.it
netselect: unknown host debian.marked.no
netselect: unknown host mirrors.terrabox.com
Running netselect to choose 1 out of 297 addresses.
................................................
The fastest server seems to be:

http://mirror.eftel.com/debian/

Choosing a non-US Debian mirror using netselect.
netselect: unknown host debian.mirror.cygnal.ca
netselect: unknown host cdn.mirror.garr.it
Running netselect to choose 1 out of 212 addresses.
................................................
The fastest non-US server seems to be:

http://linux.iq.usp.br/debian-non-US/

Writing sources.list.
Done.
#


Technorati : , , ,

e-mail com anexo a partir da linha de comando

As vezes precisamos enviar um arquivo a partir do shell de um servidor para o e-mail de algum usuário. ?? comum acessarmos um FTP do servidor e copiar o arquivo ou enviar o arquivo como conteúdo do e-mail (e não anexo). Esses tempos descobri um utilitário que me encantou: o mpack. Sua principal função é empacotar um arquivo em formato MIME.Segue um exemplo para enviar um e-mail com o arquvio /etc/hosts como anexo:

# mpack -s "Assunto qualquer" /etc/hosts usuario@email.com

?? possível enviar arquivos binários também, basta apontar o local. Caso você queira adicionar alguma descrição ao arquivo, basta utilizar o parâmetro -d [arquivo_descricao]

Também é possível apenas empacotar (ou desempacotar) o arquivo em formato MIME. No exemplo abaixo estamos codificando o arquivo /bin/ls no arquivo arquivo_mime
# mpack -s "qualquer coisa" -o arquivo_mime /bin/ls

E agora para desempacotar:

# munpack -s "qualquer coisa" arquivo_mime

Assim o arquivo ls será descomprimido no diretório raiz.

Teste de carga utilizando Shell Script

A algumas semanas atrás, fiquei responsável por realizar testes de carga em uma sistema web da Univali que foi desenvolvido para o processo de Avaliação Institucional, no qual todos os alunos e professores devem preencher um questionário avaliando as disciplinas, os professores, os coordenadores de curso… ou seja, a universidade como um todo.

Fiquei com esta tarefa, pois a alguns anos também sou responsável pelo teste de carga da aplicação responsável pela processo de matrícula via Internet.

A tarefa é “simples”: consiste em monitorar o uso de recursos de todos os servidores envolvidos no processo (servidores web, banco de dados, etc) e aplicar uma carga que deverá simular um número n de usuários efetuando um determinado processo (preenchendo um formulário, navegando em um site, etc) em um período de tempo. O objetivo é dizer quantos usuários simultâneos poderão estar utilizando o sistema com um tempo de resposta aceitável e de forma que os recursos de hardware/software não sejam consumidos completamente.

Esse “número mágico” é utilizado para definirmos se um processo será dividido por grupos de pessoas em vários dias ou se será necessário a adição de mais servidores no farm.

Bem, por que estou escrevendo isso? porque até o início do ano eu costumava utilizar um software da Microsoft para efetuar os testes de carga chamado Web Application Stress Tool. Infelizmente para algumas aplicações web eu não conseguia efetuar o teste corretamente, simulando um usuário real no sistema. Dessa vez tentei evoluir um pouco e decidi fazer a aplicação em Shell Script! :)

A experiência foi muito boa, confesso que consegui obter um resultado satisfatório e ter uma flexibilidade imensa para criar o programa. Abaixo um descrição de um dos teste executados com 500 usuários simultâneos:

Foram utilizados 500 usuários que efetuaram o processo de login na Intranet no intervalo de 5 minutos. Estava sendo disparado o acesso de exatamente 5 usuários a cada 3 segundos. Após efetuar o login, o ???usuário??? passava para a tela onde encontram-se os formulários de avaliação institucional e em seguida escolhia o primeiro formulário de avaliação referente a disciplina. Neste ponto foi adicionado um intervalo que varia de 2 a 3 minutos referente ao preenchimento do formulário. Após a conclusão o mesmo era salvo e o usuário escolhia um novo formulário. Este processo se repetiu no total de 8 vezes, sendo 5 para formulários de disciplinas cursadas e 3 referentes ao curso (Curso, coordenador e auto-avaliação). Ao final o usuário efetuava o processo de Logout da Intranet.

Para o teste de cargas utilizei principalmente o curl auxiliado por diversas outras ferramentas encontradas no shell padrão de qualquer distro. Para o monitoramento também foram criados scripts que coletavam informações como uso de CPU, memória, conexões simultâneas, processos do apache em execução e outras informações relevantes.
Acho que é isso… gostaria apenas de compartilhar mais uma idéia que podê ser resolvida com shell scripts. Quem sabe futuramente transformo esse meu conhecimento em uma aplicação mais flexivel e fácil de configurar que suporte “farms” de clientes, geração de gráficos automaticamente (pois usei o Excel pra fazer isso ;) e mais o que vier na cabeça.

Executando um comando periodicamente e exibindo seu resultado

As vezes é necessário executarmos um comando a cada n segundos para acompanhar algum processo que esteja rodando ou para analisarmos algum valor como por exemplo o uso de memória.

Para resolver este problema, existe um comando específico para isso, o Watch. Com ele podemos definir o tempo de atualização da exibição com a opção -n, e destacar os valores diferentes entre as exibições com a opção -d. O resultado é exibido em tela cheia no console.

Por exemplo, digamos que precisaremos acompanhar o uso de memória com o comando free a cada 1 segundo destacando as diferenças:

# watch -n 1 -d free -h

Para sair do modo de execução, basta pressionar [Ctrl]+c

Lembrando que caso o objeto de análise seja um arquivo texto como por exemplo um arquivo de Logs, você pode utilizar o comando tail com a opção -f. Com ele toda linha adicionada ao arquivo em análise será prontamente exibida na tela.

Por exemplo, para acompanharmos os logs gerados pelo sistema, podemos usar o comando:

# tail -f /var/log/messages

Uma dica importante, em alguns casos, como nos logs gerados pelo serviço de e-mail ou durante um processo de compilação (quando muitas mensagens são apresentadas na tela) se você quiser “parar” o scroll das mensagens, basta pressionar [Ctrl]+s. Para voltar a exibição normal, pressione a seqüência [Ctrl]+q.

Backup de Banco de Dados (PostgreSQL e/ou MySQL)

Em um post passado, disponibilizei um programa feito em Shell Script que permite efetuar o backup do MySQL. Bem, efetuei algumas atualização que havia prometido, e agora já é possivel receber e-mail após a realização do backup e fazer copias também do PostgreSQL.

Características

  • Arquivos individuais para cada bancos de dados: Permite gerar um arquivo compactado (gzip) para cada BD do seu programa de BD (MySQL ou PostgreSQL) ou,
  • Arquivo único para todos os bancos de dados: Gera um único arquivo contendo o backup de todos os bancos de dados do programa de BD (MySQL ou PostgreSQL);
  • Histórico de backup com limite máximo de versões anteriores: Ideal para casos onde é necessário restaurar o estado de um banco de dados de alguns dias atrás e o administrador não dispõe de nenhum software que gerencia o backup (Data Protector, Veritas, Tivoli, etc);
  • Arquivos com nomes únicos: Caso você utiliza algum software responsável pelo gerenciamento do backup, basta não optar pelo histórico e toda vez que for executado o script os arquivos serão sobrescritos;
  • Exclusão de Databases: Permite definir quais bancos de dados não serão copiados (funciona apenas quando for gerado arquivos individuais para cada banco de dados). Permite uma lista de exclusão por programa de BD (MySQL ou PostgreSQL);
  • Backup por programa ou integrado: Permite que seja efetuado backup apenas do MySQL, apenas do PostgreSQL ou de ambos os programas na mesma execução;

Download:
backupBd.sh (Versão 1.1)

TODO

  • Permitir a exclusão de databases mesmo quando optar-se pela geração de um único arquivo de backup;
  • Recuperação de dados (script para restore de databases);
  • Mais alguma coisa ?

Ah, todas as sugestões e críticas são bem vindas!

Backup do Banco de dados MySQL

Escrevi um programa em shell script para facilitar o backup do MySQL e decidi disponibiliza-lo para que outros administradores possam utilizar e coloborar com dicas ou sugestões. Sinceramente desta vez não pesquisei para saber se já existia algo pronto, simplesmente decidi fazer um programa que supra minhas necessidades de backup do MySQL (é, um tipo de backup para cada grupo de servidores :) ). Acredito que da forma que foi elaborado, este programa poderá auxiliar a várias pessoas com diferentes necessidades.

Algumas características:

  • Arquivos individuais para cada bancos de dados: Permite gerar um arquivo compactado (gzip) para cada BD do seu MySQL ou,
  • Arquivo único para todos os bancos de dados: Gera um único arquivo contendo o backup de todos os bancos de dados do MySQL;
  • Histórico de backup com limite máximo de versões anteriores: Ideal para casos onde é necessário restaurar o estado de um banco de dados de alguns dias atrás e o administrador não dispõe de nenhum software que gerencia o backup (Data Protector, Veritas, Tivoli, etc);
  • Arquivos com nomes únicos: Caso você utiliza algum software responsável pelo gerenciamento do backup, basta não optar pelo histórico e toda vez que for executado o script os arquivos serão sobrescritos;
  • Exclusão de Databases: Permite definir quais bancos de dados não serão copiados (funciona apenas quando for gerado arquivos individuaus para cada banco de dados;)

Um exemplo de linha do crontab para efetuar o backup ? 1:00 da manhã:
00 1 * * * /root/scripts/backupMysql.sh

DOWNLOAD:
backupMysql.sh (versão 1.0)

TODO:

  • Adicionar função para envio de e-mails;
  • Permitir a exclusão de databases mesmo quando optar-se pela geração de um único arquivo de backup;
  • Adapta-lo de forma a permitir backup do PostgreSQL;
  • Mais alguma coisa ?

Caso você tenha alguma dúvida, sugestão ou crítica, por favor compartilhe-a comigo utilizando ou o formulário de contato (na página de contatos no início desta página) ou utilizando os comentários abaixo.

Backup do BD PostgreSQL

Uma forma simples de efetuar um backup completo do BD PostgreSQL é gerando um DUMP de todas as tabelas.

Abaixo é descrito como gerar o dump e restaurá-lo novamente:

Gerando um dump completo do Postgresql:
# su - postgres
$ pg_dumpall | gzip all.gz

Restaurando o dump:
# su - postgres
$ cat all.gz | gunzip | psql template1

SimpleXML

o SimpleXML é uma biblioteca e uma aplicação de linha de comando para manipulação simples de arquivos XML. Ela permite a extração de dados de arquivos XML, alteração de valores em atributos, apresentação e substituição de dados em elementos, criação de novos elementos, etc.

Link: http://www.fit.vutbr.cz/~smrcka/projects/simplexml/