Arquivos úteis no /proc e /sys

Dentre as muitas coisas que me fascinam no Linux está a facilidade com que podemos lidar com informações de sistema. Os diretórios virtuais /proc e seu irmão mais novo, o /sys, são “locais quase sagrados” onde podemos obter todas as informações sobre o comportamento do seu computador e periféricos.

Nestes diretórios existem centenas ou talvez milhares de arquivos que podem ser usados para todos os fins. Por exemplo os que seguem abaixo são apenas umas gotinhas do oceano de informações possíveis de se obter e que uso/usei nos meus últimos scripts para gerenciamento/monitoramento dos meus servidores e até do laptop e desktop.

Informações de rede

Existem vários arquivos que podem nos fornecer informações sobre o estado das nossas interfaces de rede. Lembrando que, como se tratam de arquivos você os usará como tal em suas aplicações, ou seja, quando estiver desenvolvendo sua aplicação que os utilize – seja qual for a linguagem escolhida – abra com o respectivo comando open, leia com read e feche-o com close, só lembre que você nunca deverá abrir estes arquivos para gravação – o que algumas vezes é possível para o root – ou você corre risco de danificar seu sistema e também lembre-se que certos arquivos são restritos ao acesso do administrador apenas.

/proc/net/arp

Començando pelo básico, neste arquivo temos a tabela arp contendo os IPs e MACs das máquinas que estão em comunicação com esta máquina.

Veja no exemplo abaixo como é a formatação deste arquivo:

Não me pergunte o significado das colunas HW Type e Flags, pois eu nunca as usei, mas como isso é a própria saída do comando arp, talvez a página de manual daquele comando seja um bom começo de procura para quem interessar.

Só para dar um exemplo de uso, certa vez fiz um script baseado neste arquivo para monitorar se uma máquina, que funcionava como roteador para internet, estava sendo requisitada. Caso ela estivesse ociosa eu a desligava. Bastava verificar o que havia na tabela arp e se estivesse vazia, shutdown no sistema! Fica como exercício para sua imaginação o procedimento completo para ligar e para desligar a máquina, o que ao contrário do que possa parecer é bem simples.

/proc/net/dev

Eis um arquivo que dá muitas linhas de código a serem programadas. Nele você pode assistir em tempo real, o volume de dados trafegado pelas suas interfaces de rede.

O conteúdo deste arquivo é similar ao mostrado abaixo:

Veja que temos informações sobre a quantidade de bytes e de pacotes enviados e recebidos por cada uma das nossas interfaces de rede.

Num exemplo prático de uso destas informações você poderia ler este arquivo uma vez por segundo e pegando a quantidade de bytes enviados/recebidos e então subtrair a quantidade lida anteriormente da quantidade lida agora. O resultado disso será a velocidade de sua conexão diretamente “na boca do cano”.

/proc/net/wireless

Neste arquivo, que pode ser considerado um complemento do anterior, encontramos informações sobre a conexão wireless – caso haja alguma interface de rde deste tipo em seu sistema. Particularmente as informações que mais me interessam aqui são a qualidade e o nível do sinal, mas há outras informações úteis também, embora não estejam disponíveis para todos os modelos de interface.

Veja abaixo um exemplo de saída deste arquivo:

/sys/class/net/

Este diretório não está no /proc e sim no /sys que uma nova especificação e cuja tendencia é tornar o /proc obsoleto muito em breve. Especificamente neste diretório que estou falando temos vários symlinks que correspondem aos subdiretórios para cada uma das nossas interfaces de rede, onde temos todas as informações sobre elas separadas em arquivos. Como mostrado abaixo:

Em uma definição geral este diretório é o /proc/net/dev e o /proc/net/wireless (vistos acima) e algo mais todo separado e organizado em arquivos. A vantagem de usá-lo é que se eu quero saber apenas a quantidade de bytes recebidos, por exemplo, bastaria ler um arquivo – o rx_bytes – o que tornaria mais simples já que não terei que criar filtros para cortar o restante da linha que não me serve.

O conteúdo destes diretórios é o mesmo para todas as interfaces, com exceção do symlink “py80211” e do subdiretório “wireless” que só existem para interfaces wireless (pelo menos não notei diferenças nos meus sistemas) e deve ser algo como segue:

Para não me alongar muito, o conteúdo deste diretório e as informações mais relevantes aqui estão nos arquivos:

  • address – Endereço MAC desta interface
  • operstate – Indica se a interface está ativa ou não
    • up = ativa,
    • down = desativada,
    • unknown = só Deus é quem sabe 😉

No subdiretório statistics temos arquivos com cada informação que vimos em /proc/dev/net e creio que as estatísticas mais preciosas são as que estão em:

  • statistics/rx_bytes
  • statistics/tx_bytes
  • statistics/rx_packets
  • statistics/tx_packets

O subdiretório wireless – se presente – fornece as mesmas informações que vimos no arquivo /proc/net/wireless e como já disse as informações mais interessantes e genéricas aqui são a qualidade e o nível do sinal que estão respectivamente nos arquivos “link” e “level” deste diretório.

  • wireless/link – Qualidade do sinal
  • wireless/level – Nível do sinal

Informações sobre disco

Saber mais sobre os discos pode ser interessante caso você queira saber quais são os seus gravadores de DVD, ou a marca dos discos rígidos que veio naquele computador “xingue-lingue” que sua tia importou da China via Paraguai.

/proc/scsi/sg/device_strs

Neste primeiro arquivo podemos ver o tipo do disco (para HD geralmene é ATA, ou outro para outro tipo de disco), o modelo dos seus discos, e o número da versão do firmware de cada um; como na saída a seguir:

/proc/scsi/scsi

Este arquivo fornece mais informações além do que vimos no arquivo anterior, tal como suas marcas e modelos, canal scsi, tipo (ATA/CD-ROM) etc. Uma saída deste arquivo tem a seguinte aparência:

Informações sobre o seu processador

De forma curta grossa e direta, veja uma lista:

/proc/cpuinfo

Este é o arquivo mais famoso e conhecido por quase todos, onde temos informações gerais sobre o processador do nosso sistema. Uma saída desse arquivo mostra algo como:

Neste caso minha máquina pobre só possui um núcleo se tivesse dois ou mais veríamos todos eles aqui.

Informações sobre a memória

A memória do seu computador pode ser completamente lida a partir do arquivo /proc/kcore, mas este não é um processo muito trivial, pois só o fato de ler a memória já irá alterar o seu conteúdo entretanto tal procedimento pode ser usado para fazer análises que em outros sistemas poderia ser um procedimento tenebroso.

/proc/meminfo

Saber a quantidade de de memória total e quando você tem disponível é primordial, principalmente para quem tem apenas uma vaga lembrança no lugar da memória.

O arquivo meminfo fornee bastante informações sobre isso como mostro abaixo:

Veja que temos os totais para a memória real e para o swap o que pode ajudar quem quer monitorar o uso de memória do sistema.

Em um sistema crítico onde não havia mais como aumentar a memória do hardware e o uso do swap não era desejado eu fiz um script que emitia bips sempre que o swap atingia certo valor, então ia lá o coitado do sysadmin ver porque a memória tinha se esgotado e matar alguns processos, coisa que depois foi substituído por um script mais elaborado que já matava o processo guloso. Hoje em dia o sistema todo já roda em um novo hardware e não preciso mais dessa gambiarra, mas valeu a experiência.

/proc/swaps

Sem respirar e sem piscar, responda rápido: Qual(is) é(são) a(s) patição(ões)/arquivo(s) de swap que estão ativos no seu sistema?

Outros recursos do sistema

Nem só de rede, disco, processador e memória é feito um computador. Então podemos encontrar mais informações além daquelas, como por exemplo as que seguem.

/proc/cmdline

Possui a linha de comando passada para o kernel no instante do boot, por exemplo quando você precisa do temível “init=single” para recuperar seu sistema este parâmetro aparecerá aqui.

Uma saída desse arquivo seria como:

Isto pode ser interessante caso você tenha um hardware não usual, ou mesmo criar perfis, onde você teria duas entradas para o mesmo kernel no menu do grub/lilo, mas em uma delas você inventaria uma parâmetro como “meumodemesquisito=sim”, daí bastaria colocar um script no seu /etc/rc.local que verificaria se este parâmetro foi passado e neste caso ativar o módulo para o seu modem esquisito.

/proc/modules

Você precisa saber se dado módulo para aquela sua placa wireless, ou set de mouse/teclado sem fio estão carregados!? Eis o cara que pode te dizer isso. Não vou listar todo o meu arquivo pois ele é bem grande, mas segue um pedaço para degustação:

Um grep no meio desta salada retornaria o módulo que você deseja saber se foi ou não carregado.

Finalizando

É claro que existe muito mais do que isso e as melhores formas de descobrir o que cada aquivo destes fazem sem dúvida alguma é ler o código fonte do kernel, ou então garimpar estes diretórios e ler os arquivos um a um.

Se você conhece algum arquivo destes que seja interessante entrar na lista, deixe um comentário. com certeza ele poderá ser útil para mais alguém.

2 comentários em “Arquivos úteis no /proc e /sys”

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.