gnu linux badge

Como obter informações do sistema através do /proc

O diretório /proc é muito especial no seu sistema Unix ou GNU/Linux.
Trata-se de um sistema de arquivos virtual.
O /proc é, por vezes, chamado de “pseudo sistema de arquivos de informações de processos” ou process information pseudo-file system.
O diretório não contém “arquivos de verdade”, mas as informações referentes ao seu sistema em tempo de execução (runtime).
Entre as informações disponíveis no /proc, você pode encontrar a quantidade de memória presente no sistema, os dispositivos de armazenamento que estão montados, a configuração atual do hardware, o tempo que o seu dispositivo está ligado etc.
Uma outra forma de explicar este diretório é como um centro de controle e informações do kernel.
Isto é tão verdadeiro que vários utilitários, daqueles que fornecem informações sobre o seu sistema, apenas realizam e exibem uma leitura dos dados do /proc pra você.
Veja alguns exemplos:

  • lsmod — lê e exibe o conteúdo de /proc/modules. Ele faz a mesma coisa que o comando “cat /proc/modules”. Faça uma experiência!
  • lspci — lê e exibe o conteúdo de /proc e de /sys (também um sistema de arquivos virtual).
  • uptime — lê e exibe o conteúdo de /proc/uptime..
    Obviamente, os utilitários fazem um pouco mais do que apenas “pegar e entregar”.
    Eles formatam a informação para que fique humanamente legível.
    Veja o exemplo do uptime:

    uptime 
    15:40:39 up 2 days,  1:29,  3 users,  load average: 0,21, 0,26, 0,40

    ou

    cat /proc/uptime
    178158.72 276762.67

Dessa forma, estas ferramentas tornam sua vida mais fácil.

O conteúdo e os dados disponíveis no sistema de arquivos virtuais /proc variam em função da versão do kernel em uso no seu sistema.
Para a produção deste post, usei o Debian 8.2 “Jessie” 64 bit, com o kernel 3.16.0-4.
Fique atento para as diferenças que você pode vir a encontrar, portanto.

Ao listar os arquivos do /proc, note que quase todos têm tamanho 0 (zero).
captura de tela do comando ls -lh /proc (by Elias Praciano)
As exceções para este caso costumam ser os arquivos kcore, mtrr e self.

Os subdiretórios numerados do /proc

Ao explorar o /proc, você provavelmente vai perceber a grande quantidade de subdiretórios numerados.
Cada um deles corresponde à identificação de um processo ou process ID (PID).
captura de tela da listagem do diretório /proc em um sistema GNU/Linux por Elias Praciano
Você pode dar uma olhada na sua tabela de processos, com o comando ps.
Veja um exemplo de exibição da tabela relacionada ao servidor de banco de dados MySQL:

ps ax | grep mysqld
  930 ?        Sl     1:14 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
16158 pts/0    S+     0:00 grep --color=auto mysqld

Abaixo segue o resultado da listagem destes subdiretórios, em /proc:

Alguns dos arquivos do diretório /proc e seus subdiretórios só podem ser lidos e/ou alterados pelo root.

ls 930/
930/:
ls: não foi possível ler ligação simbólica 930/cwd: Permissão negada
ls: não foi possível ler ligação simbólica 930/root: Permissão negada
ls: não foi possível ler ligação simbólica 930/exe: Permissão negada
attr        coredump_filter  gid_map    mountinfo   oom_score      sessionid  syscall
autogroup   cpuset           io         mounts      oom_score_adj  setgroups  task
auxv        cwd              limits     mountstats  pagemap        smaps      timers
cgroup      environ          loginuid   net         personality    stack      uid_map
clear_refs  exe              map_files  ns          projid_map     stat       wchan
cmdline     fd               maps       numa_maps   root           statm
comm        fdinfo           mem        oom_adj     sched          status

Os arquivos dentro de /proc são como janelas para dentro do kernel.
Eles não contêm dados, mas apontam para o local onde se encontra a informação sobre algum processo dentro do kernel.
Veja, a seguir, uma rápida explicação sobre cada um deles — em que PID é o número que identifica o processo:

  • /proc/PID/cmdline
    Argumentos da linha de comando.
  • /proc/PID/cpu
    A última e atual CPU em que o processo foi executado.
  • /proc/PID/cwd
    link para o diretório em que o processo está trabalhando.
  • /proc/PID/environ
    Valores das variáveis do ambiente, referente ao processo.
  • /proc/PID/exe
    Link para o arquivo executável referente a este processo.
  • /proc/PID/fd
    Diretório recipiente de todos os descritores de arquivo (file descriptors).
  • /proc/PID/maps
    Mapas de memória para os executáveis e arquivos da biblioteca.
  • /proc/PID/mem
    Quantidade de memória alocada por este processo.
  • /proc/PID/root
    Link para o diretório raiz deste processo.
  • /proc/PID/stat
    Estado do processo.
  • /proc/PID/statm
    Informação do estado da memória do processo
  • /proc/PID/status
    Estado do processo, de forma legível (human readable form).

Mais informações (e com mais detalhes) podem ser encontradas na página do manual do proc — man proc.
Você pode usar os comandos cat e less para obter as informações do kernel para as quais cada arquivo está apontando.
No exemplo abaixo, segue o estado legível do meu aplicativo emulador de terminal:

/proc/3272$ cat status 
Name:	xfce4-terminal
State:	S (sleeping)
Tgid:	3272
Ngid:	0
Pid:	3272
PPid:	1517
TracerPid:	0
Uid:	1000	1000	1000	1000
Gid:	1000	1000	1000	1000
FDSize:	64
Groups:	24 25 29 30 44 46 108 110 113 118 1000 
VmPeak:	  451264 kB
VmSize:	  401392 kB
VmLck:	       0 kB
VmPin:	       0 kB
VmHWM:	   21780 kB
VmRSS:	   21780 kB
VmData:	  224364 kB
VmStk:	     136 kB
VmExe:	     172 kB
VmLib:	   21328 kB
VmPTE:	     372 kB
VmSwap:	       0 kB
Threads:	3
SigQ:	0/30741
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	0000000000000000
SigIgn:	0000000001001000
SigCgt:	0000000180010000
CapInh:	0000000000000000
CapPrm:	0000000000000000
CapEff:	0000000000000000
CapBnd:	0000003fffffffff
Seccomp:	0
Cpus_allowed:	ff
Cpus_allowed_list:	0-7
Mems_allowed:	00000000,00000001
Mems_allowed_list:	0
voluntary_ctxt_switches:	1267
nonvoluntary_ctxt_switches:	156

Os arquivos do diretório /proc têm o mesmo comportamento destes que estão nos subdiretórios PID. Seu conteúdo pode ser analisado com o uso dos comandos cat e less.
Se você combinar com o uso do comando grep, pode filtrar os resultados:

cat meminfo | grep -i swap
SwapCached:            0 kB
SwapTotal:      15998972 kB
SwapFree:       15998972 kB

O procinfo

Boa parte dos itens do sistema de arquivos /proc são apenas para leitura (readonly).
Mas alguns dos arquivos contém variáveis do kernel, que podem ser modificadas.
Esta situação abre a possibilidade de sintonizar ou “tunar” o seu kernel, sem precisar recompilar ou reiniciar o sistema.
O utilitário procinfo oferece um resumo do estado do sistema de arquivos /proc, que pode ajudar a entender o estado atual do seu sistema.

O procinfo pode não vir instalado em algumas versões de algumas distribuições GNU/Linux (Debian 8.2 Jessie, por exemplo).
Mas ele está lá, nos repositórios, caso você queira instalar.

Segue um exemplo:

procinfo 
Memory:        Total        Used        Free     Buffers                       
RAM:         7887476     3290196     4597280       62840                       
Swap:       15998972           0    15998972                                   

Bootup: Thu Nov 26 08:38:44 2015   Load average: 0.11 0.18 0.21 1/430 3861     

user  :   00:31:29.63   7.7%  page in :          1546448                       
nice  :   00:00:08.03   0.0%  page out:          1777184                       
system:   00:03:05.12   0.8%  page act:           192359                       
IOwait:   00:03:29.58   0.9%  page dea:                0                       
hw irq:   00:00:00.00   0.0%  page flt:          7626881                       
sw irq:   00:00:00.77   0.0%  swap in :                0                       
idle  :   06:09:44.63  90.6%  swap out:                0                       
uptime:   02:03:05.72         context :          8257780                       

irq   0:         19  timer               irq  40:          0  eth0             
irq   1:      25529  i8042               irq  41:          0  xhci_hcd         
irq   8:          1  rtc0                irq  42:      77055  ahci             
irq   9:       8807  acpi                irq  43:         14  mei_me           
irq  12:     108059  i8042               irq  44:     519807  i915             
irq  16:        136  ehci_hcd:usb3       irq  45:     267120  iwlwifi          
irq  23:        331  ehci_hcd:usb4       irq  46:        123  snd_hda_intel    

sdb            13581r            3069w   sda            20328r           22673w

eth0        TX 0.00B         RX 0.00B         wlan0       TX 8.23MiB       RX 39.80MiB     
lo          TX 9.70KiB       RX 9.70KiB 

Os principais arquivos do sistema de arquivos /proc

  • /proc/cmdline – Informações sobre a linha de comando do kernel.
  • /proc/console – Informações sobre consoles atuais, incluindo o tty.
  • /proc/devices – Drivers de dispositivos configurados para o kernel atual.
  • /proc/dma – Dados sobre os atuais canais DMA.
  • /proc/fb – Dispositivos do framebuffer.
  • /proc/filesystems – Sistemas de arquivos atualmente suportados pelo kernel.
  • /proc/iomem – Mapa de memória dos dispositivos conectados/integrados ao sistema.
  • /proc/ioports – Regiões das portas registradas disponíveis para comunicação.
  • /proc/loadavg – Carga de trabalho do sistema
  • /proc/locks – Arquivos atualmente bloqueados pelo kernel.
  • /proc/meminfo – Informações sobre a memória do sistema.
  • /proc/misc – Drivers diversos (miscelâneas) registrados para diversos outros dispositivos.
  • /proc/modules – Relação de módulos do kernel, que estejam carregados.
  • /proc/mounts – Lista de todos os dispositivos de hardware ou software que estejam montados no sistema.
  • /proc/partitions – Informações detalhadas sobre as partições de dispositivos de armazenamento disponíveis no sistema.
    O interessante é que este arquivo pode te dar as mesmas informações que o sudo fdisk -l — só que sem a necessidade de usar o sudo, ou seja, sem a necessidade de ter privilégios administrativos.
    Pode ser útil para incluir em um script que você planeje que seja executado por usuários comuns.
  • /proc/pci – Informações sobre os dispositivos PCI conectados.
  • /proc/stat – Fornece os dados e as estatísticas gravados desde a última inicialização.
  • /proc/swap – Dados sobre o uso do swap.
  • /proc/uptime – Tempo de uptime (em que a máquina está ligada), em segundos.
  • /proc/version – Guarda a versão do kernel, do gcc e a distribuição GNU/Linux instalada.

Como alterar o sistema de arquivos /proc

A regra geral dita que os arquivos virtuais do diretório /proc só podem ser lidos.
Alguns, contudo, podem ser alterados para produzir ajustes no kernel, em tempo de execução.
Esta possibilidade é aplicável, principalmente, aos arquivos do subdiretório /proc/sys.
Para alterar algum valor contido em um arquivo virtual, use o comando echo em conjunto com o caractere ‘>’ (maior que).
Você pode ver um exemplo disto no artigo Use sync e sysctl para esvaziar a memória cache no Linux.
Neste mesmo artigo, é possível entender como alterar os arquivos virtuais do /proc/sys com o uso da ferramenta sysctl.

O sistema de arquivos /proc no Android

Finalmente, se você tem um dispositivo Android — smartphone, tablet etc. — pode instalar um app emulador de terminal e verificar estes arquivos no diretório /proc do seu dispositivo móvel.
Se você tiver interesse, pode ler o artigo Encontre informações sobre a sua CPU, no seu dispositivo Android.
Divirta-se!

Referências

https://www.kernel.org/doc/Documentation/filesystems/proc.txt.
http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html.
http://www.tecmint.com/exploring-proc-file-system-in-linux/.

Publicado por

Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia. Fã de séries, como "Rick and Morty" e "BoJack Horseman". Me siga no Twitter e vamos trocar ideias!

Deixe uma resposta

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