quinta-feira, 9 de setembro de 2010

Linux: Scripts na Inicialização e RunLevels

As vezes precisamos que alguns comandos ou programas sejam executados na inicialização, uma maneira fácil de fazer isto é usando scripts registrados nos RunLevels.

Vamos criar um simples exemplo prático para entendermos como funciona este negócio todo (estes exemplos são baseados na estrutura do Ubuntu-server).

Primeiro iremos criar um script bash para teste:

#!/bin/bash
#
# /etc/init.d/teste

case "$1" in
    start)
    #Código a ser executado quando passado o parâmetro start
    echo "Script iniciado"
   
        ;;

    stop)
    #Código a ser executado quando passado o parâmetro stop
    echo "Script Parado"
        ;;

    *)
    #Ação padrão do script, caso parâmetro não for informado ou não ter sido tratado em outra opção.
    echo "Comando inválido"
        ;;
esac

Um script de inicialização deve conter pelo menos as opções start e stop. Você pode adicionar o parâmetro que quiser, simplesmente inserindo um novo bloco, por exemplo, para criar o comando status insira:
 
  status)
    #Aqui vai a ação para status.
    echo "Status: "
   
   ;;

A opção * deve ser sempre a última no script.

Após criar o script teste, coloque-o no diretório /etc/init.d/ e lhe dê permissão de execução:

chmod a+x teste

Apenas colocá-lo neste diretório não faz com que ele inicie automaticamente, temos ainda que configurá-lo no rc.d:


Os RunLevels

RunLevels como o nome já diz, são os níveis de execução, onde definimos quais scripts devem ser iniciados ou parados ao iniciar certo modo de execução. Abaixo segue uma tabela dos níveis em diferentes distros:


Run LevelGenéricoFedoraSlackwareDebian
0DesligarDesligarDesligarDesligar
1Modo mono-usuárioModo mono-usuárioModo mono-usuárioModo mono-usuário
2Modo multi-usuário básico (sem rede)Definido pelo usuário (não usado)Definido pelo usuário (configurado igual ao nível 3)Modo multi-usuário
3 Modo multi-usuário completo (Texto)Modo multi-usuárioModo multi-usuário - nível padrão Slackware
4Não usadoNão usadoX11 com KDM/GDM/XDM (gerenciadores de sessão)Modo multi-usuário
5Modo multi-usuário completo (Gráfico)Modo multi-usuário completo (com tela de login X) - nível padrãoDefinido pelo usuário (configurado igual ao nível 3)Modo multi-usuário
6RebootRebootRebootReboot



Os diretórios responsáveis pelos RunLevels do ubuntu server, se encontram em /etc.
São os diretórios rc0.d, rc1.d, rc2.d, rc3.d, rc4.d, rc5.d, rc6.d, que representam o nível do número respectivo. (Em algumas distros os diretórios dos RunLevels e init.d se encontram dentro da pasta rc.d em /etc)
Dentro destes diretórios encontram-se links simbólicos para os scripts a serem iniciados ou parados.

S19postgresql-8.4 -> ../init.d/postgresql-8.4

a sintaxe destes links são:
[Ação][ordem][nome]

As ações são  S (start) para iniciar o serviço e K(kill) para parar o serviço.
A ordem é em que posição ele irá iniciar, isto serve para evitar conflitos entre scripts que dependem de outros para funcionar.

Uma maneira fácil de adicionar ao runlevel é através de comando update-rc.d

A sintaxe é a seguinte
update-rc.d [nome] start [ordem] [runlevels] . stop [ordem] [runlevels] .

O script que você quer que inicie automaticamente já deve estar na pasta init.d e você deve fornecer ao comando apenas o nome dele, não todo o caminho.

update-rc.d teste start 80 2 3 4 5 . stop 79 0 6 .

O comando acima coloca o script teste para iniciar nos runlevels 2,3,4 e 5, na posição 80, e parar o serviço nos runlevels 0 e 6, na posição 79. Se você der um ls -l dentro da pasta rc3.d, por exemplo, verá o link referente ao script teste lá dentro com o seguinte nome: S80teste

Se quiser fazer um teste, reinicie o sistema, você verá que as mensagens configuradas no script já estarão aparecendo ao desligar e iniciar.

Para remover o script da inicialização use o comando: update-rc.d [nome] remove

update-rc.d teste remove

Com estes passos simples você já pode colocar scripts para inicializar automaticamente, em breve postarei algo sobre iptables e após como criar um script de firewall.

Até +   =)

Fontes:
linux.com - An introduction to services, runlevels, and rc.d scripts

sexta-feira, 3 de setembro de 2010

VIM / VI - Comandos úteis

Nas versões atuais de linux, o editor que vem instalado é o VIM (Vi IMprooved), o vi melhorado, não o vi propriamente dito. Mesmo assim o comando vi ainda é usado, sendo um link para o vim. Por este motivo irei me referir ao VIM, tanto como VI quanto como VIM.

O VIM/VI, é um editor de texto em linha de comando, que mesmo parecendo simples, é uma grande e poderosa ferramenta.
A primeira vista ele pode parecer um "monstro de sete cabeças", mas na verdade não é tão difícil usá-lo e, após se acostumar com os seus comandos básicos, ele pode se tornar um grande aliado.

Nota: Quando for me referir à uma tecla especial ou  valor informado por usuário em um comando, colocarei entre colchetes []. Exemplo: [ctrl] irá se referir à tecla ctrl (control). Isto serve para evitar possíveis confusões.

Tópicos:
      Modos de uso (comando e inserção).
      Apagando
      Desfazendo alterações
      Copiar, recortar e colar
      Movimentando-se
      Localizar
      Substituir
      Comandos diversos
      Trabalhar com vários arquivos
      Configurações úteis


Os modos de uso

Basicamente o VIM tem dois modos de operação. O modo de inserção e o modo de comando. No modo de comando, as teclas assumem papéis especiais, suas combinações servem para executar comandos e operações. O modo de inserção, como o nome já diz, serve para editar e inserir texto. Vamos ver a seguir como alternar entre estes comandos.

Abrir

Para abrir um arquivo com o VI basta digitar:

vi nome_do_arquivo

ou

vim nome_do_arquivo

Nota: caso o nome do arquivo não existe, o vi abrirá um arquivo em branco como [new file] e ao salvar ele criará o novo arquivo.

Existem alguns parâmetros que podem ser passados ao abrir o arquivo, mas estas informações não serão mostradas aqui, para mais detalhes veja a man page do vim.

Salvar, editar e sair

Para salvar um arquivo digite:
:w
Para salvar as alterações em um novo arquivo diferente do original, basta acrescentar o nome desejado:
:w novo_arquivo
Para inserir conteúdo de outro arquivo:
:r nome_do_outro_arquivo
Para abrir um outro arquivo para edição depois de abrir o vi:
:e arquivo
Para salvar e sair:
:wq
ou
:x
ou
ZZ (tome cuidado, pois ao contrário do :wq ou :x, este é muito mais fácil de ser digitado por engano)
Para sair sem salvar as alterações:
:q!

Modo de Inserção

Agora vem os comandos para entrar de diferentes formas no modo de inserção, para voltar ao modo de comando aperte a qualquer momento a tecla ESC (escape).

i - entra no modo de inserção começando a digitação à esquerda do cursor.
I - entra no modo de inserção começando a digitação no início da linha.
a - entra no modo de inserção começando a digitação à direita do cursor.
A - entra no modo de inserção começando a digitação no final da linha.
o - começa a digitação em uma nova linha após a atual.
O - começa a digitação em uma nova linha antes da atual.
r - substitui o carácter atual (sob o cursor) pelo novo digitado.
R - entra em modo de inserção substituindo os próximos caracteres  conforme digita-se (equivale à tecla insert nos editores gráficos).
[n]cw - Funciona igual ao R, com a diferença que substitui apenas [n] palavras, após continua inserindo sem substituir.
[n]cc - O mesmo que o cw, mas ao invés de definir o número de palavras, defini-se o número de linhas.

Apagando

x - apaga carácter sob o cursor.
X - apaga carácter à esquerda do cursor.
dw - apaga da posição atual até o final da palavra.
db - apaga da posição atual até o inicio da palavra.
dd - apaga linha inteira.
[n]dd - apaga [n] linhas a partir da atual.
dt[carácter] - apaga até [carácter].
D - apaga  da posição atual até o final da linha.
d$ - apaga da posição atual até o final da linha.
d0 - apaga da posição atual até o início da linha.
dG - apaga da posição atual até o final do arquivo.
dgg - apaga da posição atual até o início do arquivo.
d[n]b - apaga até [n] palavras anteriores.
df[palavra] - apaga até palavra especificada.

Desfazendo alterações

u - desfaz última alteração.
U - desfaz última alteração na linha atual.

Copiar, recortar e colar

y - copia carácter atual.
[n]yy - copia o número de linhas especificado, partindo da atual. Se não informado número copia apenas a atual.
p - cola a última coisa copiada ou apagada.
"[letra][n]yy - copia linha ou linhas para buffer correspondente. Exemplo: para copiar uma linha para o buffer d digite: "dyy
"[letra][n]dd - apaga [n] linhas a partir da atual, movendo as para o registrador [letra] (Recortar).
"[letra]p - cola conteúdo do buffer correspondente.

Nota: usar os buffers permite copiar conteúdo entre arquivos, copiar conteúdos diferentes simultaneamente e também evita que os dados se percam ao apagar algo.

Nota 2: em teclados internacionais (aqueles sem o ç e com teclas posicionadas diferente), configurados para pt-br ou qualquer idioma que use acentuação, será necessário digitar duas vezes " ou  "[espaço], porque senão ao invés de digitar o comando "ayy você estará digitando äyy.


Movimentando - se

h - move para a esquerda
H - move para a primeira linha mostrada na tela.
l - move para a direita.
L - move para a última linha mostrada na tela.
j - move para baixo.
k - move para cima.
w - move para a próxima palavra (considera pontuação uma palavra).
W - move para a próxima palavra (considera pontuação como parte da palavra).
b - move para a palavra anterior (considera pontuação uma palavra).
B - move para a palavra anterior (considera pontuação parte da palavra).
e - move para o fim da palavra (não inclui pontuação)
E - move para o fim da palavra (considera pontuação parte da palavra)
$ - move para o final da linha.
0 - move para o inicio da linha.
^ - move para o inicio da linha (se seu teclado estiver configurado para aceitar acentos, deve ser apertada duas vezes a tecla para aceitar o comando).
gg - move para o inicio do arquivo.
[n]G - move para linha de número especificado.
G - move para última linha do arquivo.
f[carácter ou texto] - move o cursor para a primeira ocorrência, na linha atual, do carácter ou texto informando.
[ctrl]e - move a tela para cima, sem modificar a posição atual do cursor.
[ctrl]y - move a tela para baixo, sem modificar a posição atual do cursor.


Obs: se for digita um número e um comando de movimentação, como h,j,k ou l o cursor repetirá o comando tantas vezes quanto informado, ou seja digitando 22j o cursor descerá 22 linhas. Isto serve também para outros comandos como inserção, delete, copia,etc.

Nota: as teclas direcionais, a tecla ENTER e a barra de espaço, muitas vezes também funcionam para movimentação, mas dependendo do teclado ou em alguns clientes ssh, eles apenas inserem carácteres especiais. Aconselho a se acostumar a usar as teclas de movimentação do VI, pois após acostumar a usá-las, a movimentação nos textos se torna muito mais rápida e fácil.


Localizar

f[palavra] - Localiza a primeira ocorrência posterior da palavra ou carácter na mesma linha.
F[palavra] - Localiza a primeira ocorrência anterior da palavra ou carácter na mesma linha.
; - repete busca por palavra na mesma linha (mesmo sentido).
, - repete busca por palavra na mesma linha (sentido inverso).
/[pesquisa] - Busca primeira ocorrência de [pesquisa] posterior a posição atual.
?[pesquisa] - Busca primeira ocorrência de [pesquisa] anterior a posição atual.
n - repete busca no mesmo sentido.
N - repete busca no sentido contrário.

Substituir

[n]s - substitui [n] caracteres por novo texto digitado.
[n]S - substitui [n] linhas por novo texto digitado.
:[intervalo]s/[x]/[y]/[opções] - substitui a ocorrência de [x] por [y].
     
   Intervalos:    [n linha inicial][n linha final] - intervalo definido.
                         ..[n linha final] - da linha atual até a linha de número definido.
                            ..$ - da linha atual até o fim do arquivo
                            % - em todo arquivo.
    Opções:        g - todas as ocorrências na linha.
                         c - pede confirmação para cada substituição.

    Exemplo:
        Substituir todas as ocorrências de vini no arquivo para vinicius, sem confirmação.

            :%s/vini/vinicius/g

        Substituir todas ocorrências da linha atual até a linha 42 de it para ti, pedindo confirmação.

            :..42s/it/ti/gc

& - repete último comando de substituição.

Comandos diversos

. - repete comando anterior.
J - junta duas linhas.
K - procura por palavra atual no manual.
V - seleção de linhas visual (use os comandos de movimentação expandir a seleção).
v - seleção de letras visual (use os comandos de movimentação para expandir a seleção).
~ - muda caso da letra atual ou seleção.
:sh - abre o shell. Após fechar o shell, retorna ao vim.
!![comando] - insere saída do comando no arquivo.

Trabalhar com vários arquivos ao mesmo tempo

Você pode abrir dois arquivos em visualização compartilhada ou normal.

Trabalhar com vários arquivos (normal):

Abrir

vi arquivo1 arquivo2

Comandos

:n - ir para o próximo arquivo da lista
:prev - voltar para arquivo anterior
:args - ver arquivos abertos

Modo tela dividida

Este modo é mais interessante, pois podemos ver todos os arquivos ao mesmo tempo

Abrir

vi -o arquivo1 arquivo2

Após o vi estar aberto, para abrir mais arquivos use:
:sp nome_do_arquivo
ou
:split nome_do_arquivo

Alternar entre arquivos

[ctrl]wj - Pula para o arquivo de cima.
[ctrl]wk - Pula para o arquivo de baixo.



Configuraçoes úteis

:set sw=[n] - Define o tamanho em caracteres da tabulação. Para usar a tabulação.
            [n]>> - Identa [n] linhas a partir da atual.
            [n]<< - Retira identação [n] linhas a partir da linha atual.

:set [opção] - para ativar algumas opções do vim.
        Opções:
                      ai - identação automática
                      ic - Ignorar caso numa busca (maiúscula/minuscula)
                      nu - Mostra numeração de linha.
                      sm - Ao fechar um parentese, chave ou colchete, é mostrado onde ele foi aberto. (Se não foi aberto soa um bip).

Para cancelar alguma opção digite:

    :set no[opção]

   Exemplo:
            :set nonu - desativa numeração de linhas.

Estas configurações se perdem ao reiniciar o vim. Para definir configurações padrões na inicialização, crie (ou modifique caso já exista) um arquivo com o nome ".exrc" na sua pasta home. Digite os comandos sem : .
Exemplo ~/.exrc :

   set sw=5
   set nu
   set sm

Este arquivo definirá a identação 5. Aparecer número de linhas e mostrar a combinação de parênteses.


Este é o final, ficou mais extenso do que eu imaginei, mas acho que já serve como uma boa base para usar o vim.
Para quem ainda não achou um uso para o vim, aqui vai algumas situações em que ele já me foi útil ou ainda é.

    * Configurações de arquivos de configuração em servidores.
    * Tratar arquivos csv muito grandes. Eles costumam travar a maioria dos editores. Já abri arquivos com mais de 1 milhão de linhas.
    * Substituições de ocorrências de palavras são relativamente rápidas, comparadas a editores gráficos.   
    * Digitar textos rápidos.
    * Criar posts =P
    * Nunca usei para programar (a não ser alguns ajustes rápidos em php), mas conheço gente que programa com o vim.

Uma alternativa para o vim, mais simples e talvez mais fácil de manipular é o mcedit, ele é muito similar àquele editor de texto que tinha no dos (telinha azul, letras brancas, comandos nas teclas de função F1,F2,F3,F4...). Eu particularmente não gosto de usá-lo, mas tenho um amigo que usa, e diz que é um ótimo quebra galho. Para quem quiser o mcedit pode ser encontrado nos repositórios da maioria das distribuições.
Para quem quiser saber mais a respeito do
mcedit (em Inglês) - http://linux.die.net/man/1/mcedit.

Isso é tudo pessoal! Espero ter ajudado.

:wq