Processos, parte 1: Introdução

Esse artigo / resumo / matéria / tutorial / apostila tem por objetivo dar uma 'geral' no assunto Processos, em sistemas Unix. 
Tal assunto é de uma abrangência vasta, sendo impossível explicar tudo em um artigo, mesmo que eu colasse aqui o 'man', ou documentação, de cada arquivo/comando. 
Um conhecimento maior só virá com o estudo de várias fontes, leitura de outros scripts e trocando informações com outros programadores.
Portanto, tome este material como referência. Através dele você terá uma noção sobre o que são Processos, para que servem, como usá-los, além de conhecer algumas ferramentas e comandos.

parte 1: Introdução
parte 2: Iniciando (launching) e matando (killing) processos
parte 3: Capturando saídas com Backtick, ` (crase)
parte 4: calculadora/comando bc
parte 5: Códigos de retorno (return codes)

Uma maneira, simples, de ver um sistema operacional, é vê-lo como um punhado de processos / programas / comandos rodando no sistema,
fazendo com que tudo funcione. Esses processos tem as mais variadas origens, como por parte do kernel, do usuário, da rede, de outros processos
etc. Logo adiante, ao checar os processos vigentes no seu sistema, entenderá melhor quando vê-los.

Poucos são os scripts em Shell que são isolados, ou seja, que são auto-suficientes em informação, comandos, processamento e armazenagem de dados.
O propósito e uso maior desse tipo de script é interagir com o sistema. Afinal, o Shell é do Unix, e foi criado para trabalharem juntos.

Essa interação se dá por meio da exploração dos processos que estão rodando, ou que você fará rodar ou parar, no sistema.
Isso é feito iniciando e fechando processos, seja em foreground (pro usuário ver) ou em background (sem você ver), usando as variáveis do ambiente e pegando as informações de retorno do processo (códigos), dentre outras maneiras.


- Checando os processos

Vamos iniciar a exploração dos processos com o comando 'ps', que lista os processos ativos:
ps -ef

Ou, para *BSD:
ps -aux

Note os dados exibidos no terminal, principalmente a PID, que mostra a ID (identificação do processo), que é a informação que usaremos para identificar e controlar o processo.

Toda essa sopa de letras tem seu significado. E tais informações estão devidamente armazenadas em variáveis do sistema. Vamos conhecer alguma delas, que são particularmente úteis para serem usadas em scripts.

- $$

Mostra a ID do atual processo. Digite no terminal:
echo $$

Depois procure essa ID na lista de processos exibida no comando 'ps -ef'.
Deve achar /bin/bash ou 'su -', caso esteja como root.
Caso execute esse comando através de script, a ID é a do script.

- $!

Mostra a ID do último processo que rodou em background do seu script.


Vamos criar um script para ver melhor essas variáveis em ação.
O script proc1.sh por si só já é auto-explicativo:
----------------------
echo "O processo atual é: $$"
echo -n "O último processo a ocorrer em background: "

# Note que não iniciamos processo algum no script
if [ "$!" == "" ]
then
echo "inexistente"
else
echo "$!"
fi

echo
echo "Executando um comando em background..."

# Vide meu artigo Pipelines caso não entenda o seguinte comando
ls /usr/bin > /dev/null &

echo "Agora, o último processo a ocorrer em background é $!"
----------------------

Permita e execute para ver o resultado:
chmod +x proc1.sh
./proc1.sh


- /proc

Os processos são tão fundamentais e importantes no sistema que existe um diretório que tem todas as informações dos processos que estão rodando, além de informações do sistem operacional, dos dispositivos USB conectados e do hardware.
Acessando tal diretório você irá notar que cada processo possui seu próprio diretório, cujo nome é a PID do processo:
ls /proc

Na verdade, ele não é bem um diretório, é um sistema de arquivos (File System) virtual, onde o kernel traça as estruturas de dados interna do kernel para que pareçam arquivos e diretórios, pois sendo vistos como tais são mais úteis, já que a maior parte dos comandos (do Unix, na verdade) trabalham com arquivos.

Vamos explorar algum desses diretórios, como o 14297 (no meu).
ls -CFl /proc/14297/fd

fd é de file descriptors (0 para stdin, 1 para stdout e 2 para stderr, por exemplo), que são mostrados antes do '->', além de sockets, pipes e outras informações daquele processo.

Dentro de cada processo existe uma série de arquivos interessantes, como o 'environ'.
Usando o comando 'cat' para olhar o conteúdo desse arquivo você verá que ele, aparentemente, está todo desorganizado.
Use o seguinte comando para ver melhor o conteúdo:
od -a /proc/14297/environ

Note que as variáveis estão separados por um caractere 'nul' (ASCII 0) ou '\000', que só é interpretado pela máquina.
Vamos usar o comando 'tr' (de translate), para transformar esse caractere em nossa quebra de linha visível, '\n':
tr "\000" "\n" < /proc/14297/environ

Agora é possível ver as variáveis do processo.

Nenhum comentário:

Veja também: