Gerenciando os Processos


Comandos intermediários do GNU/Linux

Gerenciando os Processos

Introdução

Um processo pode ser descrito como parte de um programa que está aparentemente rodando. Este aparente existe somente pelo fato de que determinado processo pode entrar e sair diversas vezes do processador em um único segundo, e em um determinado momento ele pode não estar no processador e mesmo assim aparentemente estar rodando.
Como qualquer sistema de compartilhamento de tempo o Linux consegue dar a impressão de execução simultânea dos processos, separando um espaço bastante curto de tempo para cada um deles. Para ter sucesso nesta tarefa ele segue uma serie de regras que não desperdiça tempo de hardware com operações desnecessárias e consegue escolher qual processo deve ser executado naquele exato momento.
O que decide essa escolha no kernel é o escalonador de processos, que em grande parte é responsável pela produtividade e eficiência do sistema. Mais do que um simples mecanismo de divisão de tempo, ele é responsável por uma política de tratamento dos processos que permite os melhores resultados possíveis.
A forma como o kernel gerencia os processos é bastante inteligente e podemos sempre visualizar o status do processo num determinado instante, para determinar se ele está sendo executado neste mesmo instante ou se ele está aguardando tempo de máquina para que seja executado. Dessa forma existem algumas leras que informam qual é o status do processo; se utilizarmos o comando ps aux, por exemplo, poderemos ver as seguintes letras na coluna dos status.
1
ps aux
  • D processo dormindo interruptamente (usually IO)
  • R running ( na fila de processos)
  • S dormindo interruptamente (aguardando um evento terminar)
  • T parado, por um sinal de controle
  • Z zombie, terminado mas removido por seu processo pai
  • X processo morto

Junto a essas letras podemos encontrar outros caracteres cujos significados são:

  • > o processo está rodando com prioridade maior que a padrão, tendo sido definida pelo kernel
  • < o processo está rodando com prioridade menor que a padrão, tendo sido definida pelo kernel
  • + o processo é um processo pai, ou seja, possui processos filhos
  • s o processo é um session leader, ou seja, possui processos que dependem dele
  • l o processo possui múltiplas threads
  • L o processo possui páginas travadas na memória
  • N o processo foi definido com uma prioridade diferente da padrão, tendo sido definida pelo usuário
Verificando processos com o ps
O ps é um comando de extrema importância para o gerenciamento de processos. Por ele, é possível saber quais os processos em execução atualmente, quais os UIDs e PIDs correspondentes, entre outros.
Se somente ps for digitado na linha de comando, geralmente o sistema mostra quais os processos do usuário. É preciso usar uma combinação de opções para obter mais detalhes.
As opções mais importantes são os seguintes:

a – mostra todos os processos existentes;
e – exibe as variáveis de ambiente relacionadas aos processos;
f – exibe a árvore de execução dos processos;
l – exibe mais campos no resultado;
m – mostra a quantidade de memória ocupada por cada processo;
u – exibe o nome do usuário que iniciou determinado processo e a hora em que isso ocorreu;
x – exibe os processos que não estão associados a terminais;
w – se o resultado de processo não couber em uma linha, essa opção faz com que o restante seja exibido na linha seguinte.
Das opções acima, a combinação mais usada é aux:

2
ps lax

A seguir, segue a descrição dos campos mostrados anteriormente e alguns que só são mostrados com a combinação lax:

USER – nome do usuário dono do processo;
UID – número de identificação do usuário dono do processo;
PID – número de identificação do processo;
PPID – número de identificação do processo pai;
%CPU – porcentagem do processamento usado;
%MEM – porcentagem da memória usada;
VSZ – indica o tamanho virtual do processo;
RSS – sigla de Resident Set Size, indica a quantidade de memória usada (em KB);
TTY – indica o identificador do terminal do processo;
START – hora em que o processo foi iniciado;
TIME – tempo de processamento já consumido pelo processo;
COMMAND – nome do comando que executa aquele processo;
PRI – valor da prioridade do processo;
NI – valor preciso da prioridade (geralmente igual aos valores de PRI);
WCHAN – mostra a função do kernel onde o processo se encontra em modo suspenso;
STAT – indica o estado atual do processo, sendo representado por uma letra: R – executável; D – em espera no disco; S – Suspenso; T – interrompido; Z – Zumbi. Essas letras podem ser combinadas e ainda acrescidas de: W – processo paginado em disco; < – processo com prioridade maior que o convencional; N – processo com prioridade menor que o convencional; L – processo com alguns recursos bloqueados no kernel.
Verificando processos com o top

O comando ps trabalha como se tirasse uma fotografia da situação dos processos naquele momento. O comando top, por sua vez, coleta as informações, mas as atualiza regularmente. Geralmente essa atualização ocorre a cada 10 segundos.

A sintaxe do comando top é a seguinte:

top -opção

Entre as opções, tem-se as que se seguem:
-d – atualiza o top após um determinado período de tempo (em segundos). Para isso, informe a quantidade de segundos após a letra d. Por exemplo: top -d 30;
-c – exibe a linha de comando ao invés do nome do processo;
-i – faz o top ignorar processos em estado zumbi;
-s – executa o top em modo seguro.
É possível manipular alguns recursos do comando top através das teclas do teclado. Por exemplo, para atualizar imediatamente o resultado exibido, basta pressionar a tecla de espaço. Se pressionar a tecla q, o top é finalizado. Pressione a tecla h enquanto estiver utilizando o top para ver a lista completa de opções e teclas de atalho.

3
top
4
htop



Para ter ainda mais controle sobre os processos executados no Linux, pode-se utilizar os seguintes comandos: jobs, fg e bg, fuser, pstree, nohup, kill.

jobs – serve para visualizar os processos que estão parados ou executando em segundo plano (background). Quando um processo está nessa condição, significa sua execução é feita pelo kernel sem que esteja vinculada a um terminal. Em outras palavras, um processo em segundo plano é aquele que é executado enquanto o usuário faz outra coisa no sistema. Uma dica para saber se o processo está em background é verificar a existência do caractere & no final da linha. Se o processo estiver parado, geralmente a palavra “stopped” aparece na linha, do contrário, a palavra “running” é exibida. A sintaxe do jobs é:

jobs -opção

-l – lista os processos através do PID;
-r – lista apenas os processos em execução;
-s – lista apenas os processos parados.

5

Se na linha de um processo aparecer o sinal positivo (+), significa que este é o processo mais recente a ser paralisado ou a estar em segundo plano. Se o sinal for negativo (-), o processo foi o penúltimo. Note também que no início da linha um número é mostrado entre colchetes. Muitos confundem esse valor com o PID do processo, mas, na verdade, trata-se do número de ordem usado pelo jobs.

fg e bg: Após iniciado um programa no shell, ele normalmente assumirá o controle de stdin(entrada) e stdout(saída), ou seja, usa-se a combinação de teclas [ctrl]+[Z]. Feito isso, para continuar a execução do programa em segundo plano, ou seja, mantendo o prompt do bash em primeiro plano, usa-se o comando bg (background). Para continuar a execução do programa em primeiro plano, usa-se o  comando fg (foreground).

bg +número

O número mencionado corresponde ao valor de ordem informado no início da linha quando o comando jobs é usado.

Quanto ao comando fg, a sintaxe é a mesma:
fg +número
6
7
8
9

fuser: o comando fuser mostra qual processo faz uso de um determinado arquivo ou diretório. Sua sintaxe é:

fuser -opção caminho (do arquivo ou diretório)

-k – finaliza o processo que utiliza o arquivo/diretório em questão;
-i – deve ser usada em conjunto com a opção k e serve para perguntar se a finalização do processo deve ser feita;
-u – mostra o proprietário do processo;
-v – o resultado é mostrado em um padrão de exibição semelhante ao comando ps.

10

pstree: esse comando mostra processos relacionados em formato de árvore. Sua sintaxe é:

pstree -opção PID

-u – mostra o proprietário do processo;
-p – exibe o PID após o nome do processo;
-c – mostra a relação de processos ativos;
-G – usa determinados caracteres para exibir o resultado em um formato gráfico.
Um detalhe importante: se ao digitar o comando pstree o PID não for informado, todos os processos serão listados.

11
12
Apesar do kernel gerenciar os processos, nós administradores podemos enviar sinais a esses processos requisitando que eles  alterem seu comportamento. Pa isso utilizamos o comando kill paa enviar um sinal de controle a um determinado processo.

nohup: o comando nohup possibilita ao processo ficar ativo mesmo quando o usuário faz logout. É da natureza dos sistemas baseados em Unix interromper processos caso seu proprietário não esteja mais ativo, por isso, o nohup pode ser muito útil. Sua sintaxe é:

# nohup comando

Sinais entre processos


Introdução

Um sinal é uma interrupção por software que é enviada aos processos pelo sistema para informá-los da ocorrência de eventos “anormais” dentro do ambiente de execução (por exemplo, violação de memória, erro de entrada e saída, etc). Deve-se notar que este mecanismo possibilita ainda a comunicação entre diferentes processos. Um sinal (à exceção de SIGKILL) é tratado de três maneiras diferentes em UNIX:
• ele pode ser simplesmente ignorado. Por exemplo, o programa pode ignorar as interrupções de teclado geradas pelo usuário (é exatamente o que se passa quando um processo é lançado em background).

• ele pode ser interceptado. Neste caso, na recepção do sinal, a execução de um processo é desviado para o procedimento específico especificado pelo usuário, para depois retomar a execução no ponto onde ele foi interrompido.

• Seu comportamento por default pode ser aplicado a um processo após a recepção de um sinal.
Tipos de sinais
Os   sinais são  identificados   pelo   sistema    por   um    número     inteiro. O arquivo /usr/include/signal.h contém a lista de sinais acessíveis ao usuário. Cada sinal é caracterizado por um neumônico. Os sinais mais usados nas aplicações em UNIX são listados a seguir:

kill [opções] [pid]

onde pid é o número de identificação do processo e pode ser obtido com o comando ps. Caso nenhum sinal seja especificado com o comando kill, o sinal SIGTERM (finaliza processo) é enviado.

São algumas das opções deste comando
-l – lista os sinais que podem ser enviados a um processo junto com o comando kill.
-s sinal – especifica o sinal a ser enviado, onde sinal pode estar no formato texto ou no formato de número.
-sinal – especifica o sinal a ser enviado, onde sinal é um número.

Comentários sobre as opções do comando
Suponha que o resultado do comando ps seja como mostrado abaixo.

PID TTY TIME CMD
3284 pts/0 00:00:00 bash
1244 pts/0 00:00:00 teste

Neste exemplo temos dois processos sendo executados: bash e teste. Para finalizar o processo teste, basta digitar

kill 1314

O comando acima corresponde a enviar o sinal SIGTERM (ou 15) ao processo.
Caso o processo não seja encerrado, você pode forçar o término do processo com o seguinte comando

kill -9 1314

O comando acima corresponde a enviar o sinal SIGKILL ao processo. Esta opção informa ao sistema que o comando kill não pode ser ignorado, ele deve ser imediatamente processado. Neste caso, o sistema não se preocupa em salvar dados ou apagar arquivos temporários criados durante a execução do processo.

Outros sinais que podem ser enviados com o comando kill:

  • SIGHUP (1) : reinicializa o processo (o processo ler novamente os seus arquivos de configuração).
  • SIGKILL (9) : mata o processo.
  • SGITERM (15) : terminal o processo caso não haja processos filhos.
  • SIGCONT (18) : continua o processo parado.
  • SIGSTP (20) : suspende a execução de um processo.

Lista dos nomes e números dos sinais
Use o comando kill -l para obter a lista dos sinais no Linux.

1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS 32) SIGRTMIN 33) SIGRTMIN+1
34) SIGRTMIN+2 35) SIGRTMIN+3 36) SIGRTMIN+4 37) SIGRTMIN+5
38) SIGRTMIN+6 39) SIGRTMIN+7 40) SIGRTMIN+8 41) SIGRTMIN+9
42) SIGRTMIN+10 43) SIGRTMIN+11 44) SIGRTMIN+12 45) SIGRTMIN+13
46) SIGRTMIN+14 47) SIGRTMIN+15 48) SIGRTMAX-15 49) SIGRTMAX-14
50) SIGRTMAX-13 51) SIGRTMAX-12 52) SIGRTMAX-11 53) SIGRTMAX-10
54) SIGRTMAX-9 55) SIGRTMAX-8 56) SIGRTMAX-7 57) SIGRTMAX-6
58) SIGRTMAX-5 59) SIGRTMAX-4 60) SIGRTMAX-3 61) SIGRTMAX-2
62) SIGRTMAX-1 63) SIGRTMAX
13
14
15

2 comentários sobre “Gerenciando os Processos

Os comentários estão desativados.