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).
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).
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 osudo 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/.