logo titulo
anterior indice proximo

Automação de tarefas e Logging


A administração de um sistema vai além de instalar programas e cadastrar ou remover usuários. Devemos ter meios para criar relatórios sobre o andamento das atividades do sistema, o que está funcionando, quanto tempo foi gasto com determinadas tarefas, quais usuários que rodaram determinadas aplicações (ainda mais quando estas aplicações ão taxadas por hora, como é o caso de ISPs, ou seja, provedores de acesso à internet). Felizmente o sistema possui vários meios para usarmos com esta finalidade.

O primeiro, sempre presente, mas configurável é o kernel ring buffer, que coleciona mensagens emitidas pelo sistema, geralmente relativas à instalação e retirada de módulos. O comando dmesg permite-nos listar (usado sozinho), limpar o buffer (com a opção -c), ou configurar o nível de detalhes que queremos (com -n <nível>, sendo os níveis maiores com mais detalhes). Com este programa poderemos ver quais as interfaces que o kernel reconheceu, pro exemplo.

O segundo, através do daemon syslogd, além de ler as mensagens enviadas pelo kernel (dispositivo /dev/klogd), também lê de outros dispositivos especiais relacionados com sockets do unix (/dev/log), ou das redes (especificados em /etc/services). Isso permite o uso destas facilidades por quaisquer outras aplicações. De fato, o comando logger pode ser usado para criar mensagens de logging a partir de scripts com o shell ou outras liguagens. Estas mensagens ficam armazenadas no arquivo /var/log/messages.

O terceiro é o sistema baseado nos arquivos utmp e wtmp, localizados no diretório /var/log. O utmp armazena dados somente da última sessão, enquanto que wtmp, continua crescendo. Todos os logins e logouts são registrados com data, hora e terminal. Isso permite o seu uso em um sistema de accounting primitivo. Os programas responsáveis por sua atualização são o login e o init. Estes arquivos são únicos no Linux, devido ao seu formato, em binário. Não remove o arquivo wtmp. Se ele crescer muito, efetue uma cópia de /dev/null [30] para ele, assim: cp /dev/null /var/log/wtmp e seu tamanho será reduzido a zero novamente. Para verificar os últimos 15 logins, execute last -15. (last é um comando relacionado com este mecanismo)

root-tail monitorando /var/log/messages

Screenshot ("fotografia") da tela com root-tail executando, na parte inferior. Este programa mostra em tempo real as últimas linhas de /var/log/messages.


Na parte de cima, vemos o tkps, um programa que apresenta o resultado de ps de uma forma mais agradável, e permite que enviemos sinais (signals) a qualquer dos processos. Alguns sinais mais usados já estão presentes em botões, para mais rápido acesso. (demais nos menus)

syslogd o mensageiro fiel


Muitas informações, avisos, alertas e outros tipos de mensagens vêm do kernel e daemons do sistema. O syslogd (mais um daemon), é usado para filtrar e classificar estas mesnagens, controlado por um arquivo de configuração: /etc/syslog.conf.

Este daemon é inicializado na carga do sistema, em algum dos scripts rc.??? que já discutimos. Como opções -f pode ser usado para inidcar o arquivo de configuração (caso não seja o default), -p para indicar o socket substituto de /dev/log, e -m para especificar o intervalo entre mensagens de marcação (para mostrar que está vivo!), cujo default é de 20 minutos. Estas mensagens aparecem com o texto "-- MARK --", mesmo que não haja atividade no sistema.

O arquivo de configuração do syslogd é organizado como linhas contendo um camposeletor e um campo deação, separados por tabs ou espaços.
O campo seletor, por sua vez, é formado por duas parte, separadas por um ponto: facilidade e prioridade.

O campo ação indica para onde queremos enviar a mensagem escolhida pelo campo seletor. Pode ser um nome de arquivo (exemplo: /var/log/messages), um dispositivo (exemplo: /dev/console), ou um host, isto é, uma outra máquina, que também esteja com syslogd rodando. Neste caso usamos um símbolo @ prefixando o nome da máquina (exemplo: @magico, onde magico é o nome da outra máquina). Podemos também colocar na ação, listas de usuários, separados por vírgulas (exemplo: rildo,julius). Note que arquivos são diferenciados de usuários por possuirem o path completo, ou seja, começam sempre com a barra "/".

Na prioridade, podemos adicionalmente usar o símbolo "=" para indicar mensagens somente com esta prioridade determinada, e o símbolo "!" para tirar mensagens com esta prioridade ou maior. Múltiplos seletores podem ser concatenados com ";". A palavra none numa prioridade exclui todas as prioridades. Vejamos alguns exemplos:

todas as mensagens do kernel para /var/log/kernel
kern.* /var/log/kernel
todas as mensagens mail e news para o arquivo info
mail,news.=info /var/log/info
mensagens com prioridade maior ou igual a alert para o administrador (rildo)
*.alert root,rildo
todas as mensagens para a máquina magico, para serem processadas remotamente
*.* @magico
todas as mensagens com prioridade (exatamente) warning, para o arquivo /var/log/warn, exceto as de mail e news
*.=warning;mail,news.none
mensages dos usuários (user), exceto notice, na console
user.*;user.!=notice /dev/console

syslog.conf

accounting: contabilizando por processo


Conquanto as facilidades do syslogd são úteis para informações gerais sobre o sistema, são insuficientes quando queremos saber exatamente os programas que os usuários estão executando. Podemos verificar o que um usuário está fazendo on-line através de um programa chamado ttysnoop, que é um client/server onde instalamos o servidor no lugar do login normal dos usuários e podemos ecoar (e até interferir) tudo que o usuário está fazendo em um outro terminal, que fica assim sincronizado com o do usuário. Entretanto, esta facilidade é boa somente para "espionar" um usuário suspeito, e não para criar relatórios sobre a utilização de programas, ou para fazer estatísticas de acesso às aplicações. Para esse fim existe um pacote de accounting (no Metalab, diretório Linux/system/admin) com os comandos accton, lastcomm, accttrim, dumpacct, baseado em uma série semelhante usada no BSD (unix-like desenvolvido pela U. Berkeley).

O programa accton é usado para ligar e desligar o sistema de accounting:

Com um argumento, o sistema de accounting será ligado, e cada processo será monitorado: usuário que rodou o processo, alguns flags, o nome do comando usado para iniciar o processo, o número de pagefaults (acessos a memórias que forçaram o uso doswapper), o tempo de CPU gasto com o processo, o instante que o processo terminou.

O comando lastcomm é usado para listar estes dados, sobre todos os processos acumulados até então. Para eliminar as linhas do arquivo /var/log/acct, o programa accttrim é empregado. (exemplo: accttrim -n 20 /var/log/acct deixa somente as últimas 20 entradas). Finalmente acctentries mostra o número de entradas no arquivo, bem como as datas da primeira e última.

O administrador poderá escrever alguns scripts com o shell (ou Perl!) para processar este arquivo, extraindo os dados relevantes em forma de relatório.

ligando o accounting para o arquivo /var/log/acct
accton /var/log/acct
desligando o accounting de processos
accton
listando o conteúdo deste arquivo
lastcomm -f /var/log/acct

Eis um exemplo (truncado, pois geralmente é muito grande) da tabela no arquivo /var/log/acct:

Command          Flags User     Tty    PagFlt Time        Endtime
mail             -     rildo    tty5      127   0.00 secs Tue Jan 12 14:49:20 
fortune          -     rildo    tty5      118   0.02 secs Tue Jan 12 14:49:15 
biff             -     rildo    tty5       75   0.04 secs Tue Jan 12 14:49:13 
bash             F     rildo    tty5       25   0.01 secs Tue Jan 12 14:49:12 
dircolors        -     rildo    tty5       84   0.03 secs Tue Jan 12 14:49:12 
bash             F     rildo    tty5       37   0.00 secs Tue Jan 12 14:49:12 
cat              -     rildo    tty5      101   0.02 secs Tue Jan 12 14:49:12 
sh               -     root     __        181   0.02 secs Tue Jan 12 14:48:49 
bash             SX    root     __        197   0.04 secs Tue Jan 12 14:48:44 
gimp             S     root     ttyp0     482   0.22 secs Tue Jan 12 14:48:44

automatizando tarefas repetitivas


Muitas tarefas como "obter os jornais na internet, diariamente", "checar e-mail a cada 30 minutos", "elaborar relatóros com horas de acesso dos usuários", e outras, devem ser realizadas com datas e horários pré-estabelecidos. Seria muito tedioso deixar um operador executar manualmente cada uma delas, além de sujeito a falhas. Para automatizar tarefas que sejam realizadas em datas e horas determinadas, ou a cada segunda-feira por exemplo, ou mesmo no dia 31 de dezembro de cada ano, o utilitário cron é o especialista!

Além das tarefas do administrador, estas mesmas facilidades estão disponíveis para cada usuário "mortal" do sistema, bastando para isso ele editar a sua própia crontab, ou usar um dos muitos utilitários mais user-friendly para fazer isso.
O que há numa crontab? Como na mioria dos arquivos de configuração do Linux, somente texto! Vejamos o seu formato:

   minutos horas dia-do-mes mes dia-da-semana comando

Como usual, espaços separam os campos. O campo comando, adicionalmente, pode ter quantos espaços forem necessários (por isso ele fica no final). Cada um dos outros campos assume valores numéricos com faixas determinadas pela tabela:

minutos 0-59 Um asterisco "*" pode ser usado para indicar qualquer valor (widcard) permitido para esse campo.

Um campo pode ter vários valores, separados por vírgulas para admitir cada um dos valores para a variável. (exemplo: se colocarmos 1,11,21 na coluna dia-do-mes, a tarefa será realizada nesses tres dias dos meses). Podemos também entrar uma faixa usando um hífen separando os dois valores: <inicio>-<fim> (exemplo: queremos os jornais todos os dias, exceto sábados e domingos. Entraremos na coluna de dias-da-semana 1-5). Outra notação que possibilita repetir o comando a cada n unidades numa determinada faixa é: <faixa>/<passo> (exemplo: realizar um comando das 8 às 19 horas, a cada 2 horas: na coluna de horas, teremos 8-20/2).

Podemos também usar nomes abreviados dos meses e dos dias das semana (em ingles) nos campos correspondentes.

horas 0-23 (onde 0 é meia-noite)
dia-do-mes 1-31
mes 1-12
dia-da-semana 0-6 (onde 0 é o domingo)

Os campos de uma crontab são combinados como vários filtros em cascata, somente sendo executado o comando quando todos os valores se verificam, e quando isto é verdade, a execucão se processa uma só vez, sendo necessário um novo acontecimento para se obter nova execução. Isto evita a possibilidade de um comando "muito rápido" ser executado inúmeras vezes porque os seus campos combinam com o momento atual. Outra peculiaridade do crond é a saida padrão, que normalmente está redirigida a uma geração de mensagem (e-mail) para o usuário. Prar modificar este comportamento, podemos redirigir a saida padrão para outro local, por exemplo, adicionando a um arquivo com >> arquivo.

Um exemplo sofisticado de entradas na crontab:

 */20 8-18 * * Mon-Sat cat /var/log/messages|gzip >msg-`date +%y%m%d-%H:%M`.gz

Este exemplo mostra um comando relativamente sofisticado, onde queremos salvar o arquivo de mensagens do sistema, compactado a cada 20 minutos, portanto no minuto 0, 20 ou 40 de cada hora, na horário comercial (8-18), de segunda (Mon) a sábado (Sat), todos os meses do ano. Simplesmente usamos o cat para "imprimir o arquivo" em stdout, passamos por um pipe para o gzip, que joga a saida comprimida em um outro arquivo cujo nome deve ser variável (para não ser reescrito, a não ser que quisessemos adicionar o resultado no final com >>). Para definir o nome do arquivo, usamos uma propriedade do shell (substituição de comandos) já vista, e o comando date para nos devolver a data no formato desejado. Um arquivo típico para hoje seria:

data (e hora) normal de hoje: Tue Jan 12 19:57:09 EDT 1999

data com o formato acima: 990112-19:57 o que daria o nome do arquivo msg-990112-19:57.gz.

Para melhorar esta ferramenta, poderíamos "limpar" o arquivo messages no final adicionando no comando: ; cp /etc/null /var/log/messages. (o ";" é necessário para indicar novo comando para o shell) Note que não podemos simplesmente remover o arquivo messages, porque o syslog precisa dele para salvar as mensagens.


rpragana
Mon Jan 11 18:57:53 EDT 1999