Tag Archives: shell

Coisas sobre Linux que me chamaram a atenção recentemente

LinuxVersions

Você pode não saber (ou esquecer às vezes), mas o Linux está muito presente na sua vida. Mesmo que você não o use diretamente como sistema operacional principal, mais da metade dos sites que você acessa está rodando em plataforma Linux. Isso inclui empresas gigantes como Google, Facebook, Twitter, Soundcloud, Amazon, Spotify, etc – a lista é muito, mas muito longa. A maioria dos filmes que você assiste utilizam Linux para renderizar cenas extremamente complexas que às vezes levam semanas ou mesmo meses para serem renderizados. O sistema móvel Android também é um Linux também caso você não saiba. E o seu roteador e a sua SmartTV provavelmente rodam Linux também!

Embora atualmente meu computador principal rode OS X, eu estou em contato com vários servidores que rodam Linux os quais acesso frequentemente. Além disso, utilizei Linux como S.O. principal de 2007 à 2011, através das distros Ubuntu e OpenSUSE (além de outras que utilizei por pouco tempo, como Slackware e Debian).

Na última semana várias coisas me chamaram a atenção no mundo Linux e esse é o motivo desse post:

1. O último episódio do podcast do Hack ‘n’ Cast (v0.3) foi uma introdução ao Linux e foi muito bom, vale a pena escutar: http://mindbending.org/pt/hack-n-cast-v03-introducao-ao-gnulinux.

2. Um amigo que é programador disse que nunca (palavra forte!) usaria Linux porque nem criar um script similar ao batch do “Janelas” ele conseguia. Bom, pensando que isso pudesse ser útil para mais pessoas, gravei um screencast ensinando como criar scripts no Linux e no Mac OS X: http://youtu.be/W84Ok6XGnow.

3. Assisti à uma ótima palestra chamada “Linux Sucks”: http://youtu.be/5pOxlazS3zs.

4. Lembrei e reli o excelente ponto de vista do Pothix sobre porque ele deixou o OS X e voltou a usar Linux: http://pothix.com/blog/development/menos-mac-e-mais-linux.

5. Pra finalizar (e descontraír), há um tempo atrás eu ganhei de um amigo que trabalha na RedHat um chapél vermelho (red hat, rá!), o qual foi parar na cabeca do Tux que eu tenho na minha estante, vide fotos abaixo. Ficou bem bacana! :-)

1

2

Bom, essa não é a primeira vez que eu escrevo sobre Linux e também não será a última. Linux é muito mais importante do que as pessoas pensam. Pense 3 vezes antes de subestimar o sistema do pinguim! ;)

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!

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 :)

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.