Tag Archives: linux

Criando um log com detalhes de erros

Quando rodamos algum script em sistemas Unix, existem 3 tipos de mensagens de entrada e saída:

  • STDIN – Standard in (código 0)
  • STDOUT – Standard out (código 1)
  • STDERR – Standard error (código 2)

Se você precisar salvar um log contendo não só as mensagens da saída padrão, mas também as mensagens de erro, use o seguinte sufixo: 2>&1, assim:

ls -lR / > /tmp/file.log 2>&1

O que estamos fazendo aí é pegando tudo que é da saída 2 (STDERR) e jogando pra saída 1 (STDOUT), fazendo com que o log contenha tudo :)

Valeu Wagnão pela dica!

Meu ambiente de trabalho

O Anderson Casimiro e o Augusto Pascutti criaram um meme sobre ambientes de trabalho. As regras são simples:

1. Escreva sobre seu ambiente de trabalho – fale sobre qualquer ponto que quiser;
2. Indique de 3 à 5 pessoas para que possivelmente façam um artigo sobre seu ambiente.

Fui convidado pelo Bruno Codeman para montar minha lista!

1. OS: Ubuntu 10.10

Atualmente, a mais popular distriuição Linux. Como é baseada no Debian, herdou o apt pra gereciar os pacotes. Todo o meu hardware funciona bem e raramente o sistema fica lento ou trava. Ultimamente tem ficado até mais bonito…

2. IDE: Vim

Rápido, flexível, snippets, atalhos produtivos e ainda conta com excelentes plugins. Desenvolvo em Ruby e Ruby on Rails utilizando somente ele e sempre dá conta do recado.

3. Browser: Google Chrome

Há um ano atrás, o experimentei e este substituiu o meu querido Firefox. Com todas as extensions disponíveis hoje, quase não preciso de outro browser, embora exporadiamente use o Firefox pra usar os add-ons WebDeveloper e Firebug.

4. Versionamento: Git

Git ganhou meu respeito. O utilizo há 1 ano e meio e definitivamente me atendeu melhor que o SVN. Não dá pau e é muito eficiente. É atualmente um dos softwares que mais me orgulho de usar.

5. Linguagem de programação: Ruby

Já desenvolvi em PHP, Delphi, Java e até brinquei um pouco com .Net e Phython. Mas nada, nada me faz mais feliz que programar em Ruby. A sintaxe é limpa, o suporte à metaprogramação é ótimo, desenvolver usando BDD é muito fácil e a comunidade é fantástica.

6. Banco de Dados: PostgreSQL

Usei MySQL por muito tempo e me atendia muitíssimo bem. Mas ano passado tive que começar a trabalhar em alguns projetos que usavam PostgreSQL e seu poder me convenceu e se tornou meu database padrão.

Indicação de 5 amigos pra continuar o meme:

1. Eduardo Ramos
2. Vitor Laubé
3. Thiago Aléssio
4. Jésus Lopes
5. Eder Costa

Pequenas soluções usando linha de comandos – IV (movendo arquivos)

O comando ‘mv’ serve básicamente pra duas coisas: mover arquivos de um diretório pra outro e renomear arquivos.

Algo interessante que aprendi com o Eduardo Ramos foi como mover apenas alguns tipos de arquivos. Por exemplo, se eu precisar mover todos os arquivos com extensão .txt e .doc para um diretório ‘docs’, bastaria fazer:

mv /home/caton/{*.txt,*.doc} /home/caton/docs

Enjoy! :)

Pequenas soluções usando linha de comandos – III (Script de backup)

Nesse post vou compartilhar um script simples e eficiente pra fazer backup no Linux, usando o Rsync.

Atenção! Se você estiver fazendo backup numa partição FAT, recomendo este post do Leandro Lazarte.

Teremos dois diretórios: um diretório “fonte” contendo os arquivos os quais devem ser feito backup e outro “destino” que é onde a cópia será realizada. O Rsync é um software mais de sincronização do que de backup propriamente dito. Isso signfica que as alterações que você fizer no diretório “fonte” – ao rodar o Rsync – se refletirá no diretório “destino”, incluindo criação, alteraração ou exclusão de arquivos e pastas.

O script é este:

#! /bin/bash
#---------------------------------------
# Script que realiza backup automatizado
# by Lucas Catón
#---------------------------------------

SOURCE_DIRECTORY=/home/caton/
DESTINATION_DIRECTORY=caton@10.10.10.2:/home/anyuser/bkp

sudo rsync -Cavz --progress --partial --delete --numeric-ids --exclude="*.gvfs" $SOURCE_DIRECTORY $DESTINATION_DIRECTORY

clear
echo Backup realizado com sucesso.
echo

Explicando: as variáveis SOURCE_DIRECTORY e DESTINATION_DIRECTORY são apenas pra deixar o script mais organizado e fácil pra alterar os diretórios. Note que o segundo diretório que eu coloquei é um diretório remoto, acessado via protocolo ssh. A sintaxe é simples: usuário@ip:diretório.

Sobre os parametros utilizados (progress, partial, etc), vale a pena dar uma olhada no man pra entender e customizar, de forma que te atenda melhor. Por exemplo: comigo, às vezes dá pau em arquivos .gvfs, que ficam no /home, então eu mandei ignorá-los.

Se for interessante pra você, é possível salvar um log de cada backup:

#! /bin/bash
#---------------------------------------
# Script que realiza backup automatizado
# by Lucas Catón
#---------------------------------------

SOURCE_DIRECTORY=/home/caton/
DESTINATION_DIRECTORY=caton@10.10.10.2:/home/anyuser/bkp

LOG_FILE=~/logs/bkp_"$(date "+%F")".log
touch $LOG_FILE

sudo rsync -Cavz --progress --partial --delete --numeric-ids --exclude="*.gvfs" $SOURCE_DIRECTORY $DESTINATION_DIRECTORY > $LOG_FILE

clear
echo Backup realizado com sucesso.
echo O log encontra-se em: $LOG_FILE
echo

Outra coisa interessante é colocar esse script no cron. Assim, de tempos em tempos ele será executado automaticamente.

Pra finalizar, uma solução alternativa. Dependendo do tipo de backup, em vez de criar um script, um simples alias no ~/.bashrc já resolve:

alias runrsync='sudo rsync -Cavz --progress --partial --delete --numeric-ids --exclude="*.gvfs" /home/caton/ caton@10.10.10.2:/home/anyuser/bkp'

Afinal, “Simplicidade é a sofisticação máxima” (Leonardo da Vinci)

Pequenas soluções usando linha de comandos – II

Escrever um script que roda em daemon (backgounrd) e repete algum comando de tempos em tempos é extremamente simples e pode resolver vários problemas.

Há um tempo atrás precisei de um listening em um diretório que ficasse mudando permissões de arquivos que eram importados automáticamente. O script ficou assim:

#! /bin/bash
#Script para dar permissão de acesso aos arquivos para o faturamento
#Roda em daemon

#loop infinito
while((1)); do
  #faz o que tem que ser feito
  chown -R nobody:faturamento /home/faturamento/importacoes;
  #pausa por 5 segundos (ou quantos você quiser)
  sleep 5;
# o "&" no final é quem faz o script rodar em daemon
done &

#por fim, mostra uma mensagem
echo 'Script rodando em daemon...'

Se você tiver outras formas de fazer isso (acredito que deva existir outras até melhores), mande através dos comentários :)

Ubuntu 10.04 + Ruby on Rails + PostgreSQL 8.4

Atenção:

Esse post é uma cópia do README de um projeto que criei no final do ano passado, afim de organizar o passo-a-passo da instalação das ferramentas que uso (como Rails e PostgreSQL) e também de alguns dotfiles. Atualmente, já existe uma versão mais atual do Ubuntu e algumas coisas deste tutorial podem não funcionar corretamente. Então, recomendo que você verifique o tutorial atualizado na página inicial do projeto: http://github.com/lucascaton/lcaton-setuplinux.

Recentemente atualizei meu Ubuntu para a versão 10.04 e esse script de instalação está atualizado para ser usado nesta versão. Esses passos incluem a instalação do Ruby através do RVM, Rails 2.3.5, PostgreSQL 8.4 e algumas outras coisas. Sempre que eu atualizar o Ubuntu ou mudar algum procedimento ou ainda um dotfile, vou alterar no projeto do github também.


Versão atual: Ubuntu 10.04 (desktop edition – 32 bits)

Instalação básica

Antes de mais nada

sudo aptitude update

Open SSH Server

sudo aptitude install openssh-server

Git & gitg

sudo aptitude install git-core gitg

Curl

sudo aptitude install curl

Suporte à arquivos compactados

sudo aptitude install rar p7zip-full

GTK Record My Desktop e Mencoder / Mplayer

sudo aptitude install gtk-recordmydesktop mplayer mencoder ffmpeg

nmap (Usage ‘sudo nmap -sS ’ pra saber as portas abertas de uma máquina remota)

sudo aptitude install nmap

Criar DVDs e converter vídeos

sudo aptitude install devede

Gimp (a partir da versão 10.04 do Ubuntu o Gimp não vem instalado por padrão)

sudo aptitude install gimp

Fonts true type

sudo aptitude install msttcorefonts

Wine

sudo aptitude install wine

Copiar arquivos deste projeto

git clone git://github.com/lucascaton/lcaton-setuplinux.git ~/.setuplinux

Instalar fonte Monaco

sudo mkdir /usr/share/fonts/truetype/myfonts
cd /usr/share/fonts/truetype/myfonts
sudo cp ~/.setuplinux/files/Monaco_Linux.ttf .
sudo chown root:root Monaco_Linux.ttf
sudo mkfontdir
cd ..
fc-cache

Gvim

sudo aptitude install vim-gnome ncurses-term exuberant-ctags

Vimfiles

mv ~/.vim ~/vim_old
git clone git://github.com/lucascaton/cmarques-vimfiles.git ~/.vim
mv ~/.vimrc ~/vimrc_old
mv ~/.vim/vimrc ~/.vimrc

Gmate

git clone git://github.com/lexrupy/gmate.git
cd gmate && sh install.sh && cd .. && rm -rf gmate

DotFiles

cp ~/.setuplinux/dotfiles/.bashrc ~
cp ~/.setuplinux/dotfiles/.fonts.conf ~
cp ~/.setuplinux/dotfiles/.gemrs ~
cp ~/.setuplinux/dotfiles/.gitconfig ~
cp ~/.setuplinux/dotfiles/.irbrc ~

PostgreSQL

sudo aptitude install postgresql postgresql-contrib libpq-dev pgadmin3

Configurar a senha do PostgreSQL

sudo passwd postgres
su - postgres
psql -c "ALTER USER postgres WITH PASSWORD 'sua_senha'" -d template1

Sqlite3

sudo aptitude install sqlite3

JDK

sudo aptitude install openjdk-6-jre-headless

Ruby on Rails

Bibliotecas necessárias

Readline headers

sudo aptitude install libreadline5-dev

C++ compiler (necessário para o Ruby)

sudo aptitude install build-essential

OpenSSL development headers (necessário para o Ruby)

sudo aptitude install libssl-dev

Sqlite support

sudo aptitude install libsqlite3-dev sqlite-dev libdbd-sqlite3-ruby libsqlite3-ruby libsqlite3-ruby1.8

Mysql Client (necessário para a gem ‘mysql’)

sudo aptitude install libmysqlclient15-dev

libxslt (necessário para a gem ‘capybara’)

sudo aptitude install libxslt-dev

Sphinx (necessário para a gem ‘thinking-sphinx’)

wget http://www.sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz
tar -xzvf sphinx-0.9.9.tar.gz && cd sphinx-0.9.9
./configure --with-pgsql && sudo make && sudo make install
cd .. && rm -rf sphinx-0.9.9

Image Magick (necessário para a gem ‘gruff’)

sudo aptitude install imagemagick libmagick9-dev

Cups Sys (necessário para a gem ‘cups’)

sudo apt-get install libcupsys2-dev

Avahi – dnssd (necessário para a gem ‘specjour’)

sudo apt-get install libavahi-compat-libdnssd-dev

RVM

bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )

Atualizar RVM

rvm update --head

Rubies

rvm install ree
rvm install ruby-1.9.1
rvm install jruby

Gemset

gem sources -a http://gems.github.com
rvm gemset create caton
cp ~/.setuplinux/files/caton.gems .
rvm gemset import caton.gems
rm caton.gems
rvm --default ree@caton

Outros

Outros softwares:

  • Google Chrome
  • TweetDeck
  • Eclipse (IDE)
  • Skype

Duas pequenas soluções usando linha de comandos

Bom, este é um post curto (mas que acredito que terá outros similares) com pequenas soluções interessantes usando linha de comandos – uma quase “bala de prata” pra quem usa Linux e Mac.

Como deletar vários sub-diretórios de uma só vez

Eu precisei fazer isso quando queria retirar os sub-diretórios do svn de uma pasta, ou seja, “desversionar” um projeto.

Só pra entender melhor, um projeto versionado pelo svn, segue o padrão da seguinte estrutura de diretórios:

./.svn
./app/.svn
./app/models/.svn
./config/.svn

O comando pra remover todos estes diretórios é:

find -name ".svn" -type d -exec rm -rvf {} \;

E significa: procure por tudo que tiver o nome .svn e que for um diretório e quando encontrar, execute um comando rm -rvf nele. Os paramêtros do rm significam: r – recursive (pra apagar diretórios), v – verbose (exibir as pastas que estão sendo apagadas), f – force (não pedir confirmação pra apagar).

Como extrair uma parte de um arquivo grande pra outro menor

Eu precisei fazer isso porque o arquivo do qual seria extraído uma parte era grande demais (1,5gb) e o vim e o gedit (ou qualquer outro) teriam dificuldade pra abri-lo.

Vamos supor então que eu tenha um arquivo chamado banco.dump com 20 milhões de linhas e eu queria extraír o conteúdo das linhas 12.000.000 até a linha 12.000.500 para um outro arquivo que vou chamar de novo.txt.

O comando pra fazer isso é:

cat -n banco.dump | head -n 12000500 | tail -n 500 > novo.txt

Explicando: o paramêtro passado no head é a linha final (12000500) do range desejado. E o 500 passado no tail é quantas linhas pra trás ele deve pegar. E pra finalizar é só jogar tudo pra dentro do novo.txt.