1. Informação Sobre Processos

Se você listar o conteúdo do diretório /proc, você verá vários diretório que possuem números como nome. Estes são os diretórios contendo informações de todos os processos que estão sendo executados no sistema:

$ ls -d /proc/[0-9]*
/proc/1/    /proc/302/  /proc/451/  /proc/496/  /proc/556/  /proc/633/
/proc/127/  /proc/317/  /proc/452/  /proc/497/  /proc/557/  /proc/718/
/proc/2/    /proc/339/  /proc/453/  /proc/5/    /proc/558/  /proc/755/
/proc/250/  /proc/385/  /proc/454/  /proc/501/  /proc/559/  /proc/760/
/proc/260/  /proc/4/    /proc/455/  /proc/504/  /proc/565/  /proc/761/
/proc/275/  /proc/402/  /proc/463/  /proc/505/  /proc/569/  /proc/769/
/proc/290/  /proc/433/  /proc/487/  /proc/509/  /proc/594/  /proc/774/
/proc/3/    /proc/450/  /proc/491/  /proc/554/  /proc/595/

Note que, como um usuário, você só pode (logicamente) exibir informações relacionadas aos seus processos, e sobre os processos dos outros usuários. Então, acesse o sistema como root e veja quais informações estão disponíveis sobre o processo 1, que é o processo do init e o responsável por iniciar todos os outros:

$ su
Password:
# cd /proc/1
# ls -l
total 0
-r--------  1 root root 0 Aug 15 18:14 auxv
-r--r--r--  1 root root 0 Aug 15 18:14 cmdline
lrwxrwxrwx  1 root root 0 Aug 15 18:14 cwd -> //
-r--------  1 root root 0 Aug 15 18:14 environ
lrwxrwxrwx  1 root root 0 Aug 15 18:14 exe -> /sbin/init*
dr-x------  2 root root 0 Aug 15 18:14 fd/
-rw-r--r--  1 root root 0 Aug 15 18:14 loginuid
-r--r--r--  1 root root 0 Aug 15 18:14 maps
-rw-------  1 root root 0 Aug 15 18:14 mem
-r--r--r--  1 root root 0 Aug 15 18:14 mounts
-rw-r--r--  1 root root 0 Aug 15 18:14 oom_adj
-r--r--r--  1 root root 0 Aug 15 18:14 oom_score
lrwxrwxrwx  1 root root 0 Aug 15 18:14 root -> //
-rw-------  1 root root 0 Aug 15 18:14 seccomp
-r--r--r--  1 root root 0 Aug 15 18:14 stat
-r--r--r--  1 root root 0 Aug 15 18:14 statm
-r--r--r--  1 root root 0 Aug 15 18:14 status
dr-xr-xr-x  3 root root 0 Aug 15 18:14 task/
-r--r--r--  1 root root 0 Aug 15 18:14 wchan
#

Cada diretório contém as mesmas entradas. Aqui está uma descrição breve de algumas delas:

  1. cmdline: este (pseudo-)arquivo contém toda a linha de comando utilizada para invocar o processo. Ela não está formatada: não há espaços entre o programa e seus argumentos, e nem caractere de nova linha no final. Para visualizá-la, você pode usar: perl -ple 's,\00, ,g' cmdline.

  2. cwd: este link simbólico aponta para o diretório de trabalho atual do processo (“cwd - current working directory (diretório de trabalho atual)”).

  3. environ: este arquivo contém todas as variáveis de ambiente definidas para este processo, na forma VARIÁVEL=valor . Similar ao cmdline, a saída não é formatada de nenhuma maneira: as variáveis não são separadas em novas linhas, e também não há indicação de nova linha no final. Uma maneira de vê-la é através do comando: perl -ple 's,\00,\n,g' environ.

  4. exe: este é um link simbólico apontando para o arquivo executável do processo.

  5. fd: este subdiretório contém a lista dos descritores de arquivo atualmente abertos pelo processo. Veja abaixo.

  6. maps: quando você exibe o conteúdo deste pipe nomeado (com o comando cat por exemplo), você pode ver as partes do espaço de endereço do processo que está mapeado para um arquivo. Da esquerda para a direita, os campos são: o espaço de endereço associado a este mapeamento, as permissões associadas a estes mapeamento, a marca no início do arquivo onde começa o mapeamento, o número principal e secundário (em hexadecimal) do dispositivo em que o arquivo mapeado está localizado, o número do inode do arquivo, e finalmente o nome do arquivo propriamente dito. Quado o dispositivo é 0 e não há número de inde ou nome do arquivo, este é um mapeamento anônimo. Veja mmap(2).

  7. root: este é um link simbólico que aponta para o diretório raiz utilizado pelo processo. Normalmente ele será /, mas veja chroot(2) para mais informações.

  8. status: este arquivo contém diversas informações sobre o processo: o nome do executável, seu estado atual, seu PID e PPID, seu UID e GID real e efetivo, seu uso de memória, e outras informações. Note que os arquivos stat e statm são obsoletos. A informação que eles contém está agora armazenada no status.

Se nós listarmos o conteúdo do diretório fd para um processo escolhido aleatoriamentes nós iremos obter isso:

# ls -l /proc/8141/fd/
total 4
lrwx------  1 usuario2 usuario2 64 Aug  4 09:05 0 -> /dev/tty1
lrwx------  1 usuario2 usuario2 64 Aug  4 09:05 1 -> /dev/tty1
lrwx------  1 usuario2 usuario2 64 Aug  4 09:05 2 -> /dev/tty1
l-wx------  1 usuario2 usuario2 64 Aug  4 09:05 3 -> /home/usuario2/seti32/lock.sah
#

Na verdade, esta é a lista de descritores de arquivo aberta pelo processo. Cada descritor aberto do arquivo é exibido por um link simbólico, onde o nome é o número descritor, e aponta para o arquivo aberto por ele[7]. Note as permissões nos links simbólicos: este é o único lugar onde elas fazem sentido, já que elas representam as permissões do arquivo aberto que corresponde ao descritor.



[7] Se você se lembra o que foi explicado na Seção 4, “Redirecionamentos e Pipes”, você sabe o que significam os descritores 0, 1 e 2. O descritor 0 é a entrada padrão, 1 é a saída padrão e 2 é o erro padrão.