terça-feira, 19 de novembro de 2013

CONTROLE DE PROCESSO LINUX / UNIX

Controle de Processo

Devido ao fato de ser multi-usuários e multi-tarefas, implica que necessitamos gerenciar estes recursos naturais do Linux através da interface de linha de comando.
Como qualquer sistema operacional multi-tarefas, Linux executa processos múltiplos e simultâneos.
Embora este pareçam ser simultâneo, na realidade um único processador poder executar um processo por vez; contudo o núcleo do Linux gerencia os recursos de forma a permitir a cada processo utilizar o processador e parecer que cada processo esta sendo executado ao mesmo tempo.
Há vários comando que podem ser usados no controle de processos:
  • ps     - lista os processos que estão em execução no sistema
  • kill  - envia um sinal para um ou mais processos (geralmente para "matar" um processo)
  • jobs  - uma maneira alternativa de listar seu próprios processos
  • bg     - envia um processo para o background (segundo plano)
  • fg     - envia um processo para o foreground (primeiro plano)

Um exemplo Prático

Embora possa parecer que este assunto é um tanto obscuro, pode ser muito prático para o usuário em geral, que na maioria das vezes trabalha com a interface gráfica do usuário. 
Você pode não saber disso, mas a maioria (se não todos) dos programas gráficos podem ser executados a partir da linha de comando. Aqui está um exemplo: há um pequeno programa fornecido com o sistema X Windows chamado xload que exibe um gráfico que representa a carga do sistema. Você pode executar este programa, digitando o seguinte:


[alex@linux alex]$ xload


Observe que a pequena janela xload aparece e começa a exibir o gráfico carga do sistema. Observe também que o seu prompt não reapareceu depois que o programa foi executado. O shell está aguardando que o programa termine antes que o controle retorne para você. Se você fechar a janela do xload, o programa xload será fechado e o prompt retornará.

Colocar um programa em background (segundo plano)


Agora, a fim de tornar a vida um pouco mais fácil, nós vamos executar o programa xload novamente, mas desta vez, vamos colocá-lo em segundo plano para que o prompt volte a ser exibido. Para fazer isso, nós executamos xload assim:

[alex@linux alex]$ xload &
[1] 1223
[alex@linux alex]$


Neste caso, o prompt retorna porque o processo foi colocado no plano de fundo. Agora imagine que você se esqueceu de usar o símbolo "&" para colocar o programa em segundo plano. 
Ainda há esperança. Você pode digitar "control-z" e o processo será suspenso. O processo ainda existe, mas está inativo. Para retomar o processo em segundo plano, digite o comando bg (abreviação de background - fundo). Aqui está um exemplo:

[alex@linux alex]$ xload
[2]+ Stopped xload
[alex@linux alex]$ bg
[2]+ xload &

Listando seus Processos

Agora que temos um processo em segundo plano, seria útil exibir uma lista dos processos que estão em execução. Para fazer isso, podemos usar o comando jobs ou o comando ps.


[alex@linux alex]$ jobs
[1]+ Running xload &
[alex@linux alex]$ ps
PID TTY TIME CMD
1211 pts/4 00:00:00 bash
1246 pts/4 00:00:00 xload
1247 pts/4 00:00:00 ps
[alex@linux alex]$

Matando Um Processo (Kill)

Suponha que haja um programa que deixa de responder; como se livrar dele? Pode ser usado o comando kill, é claro. Vamos fazer isso em xload. Primeiro, precisa-se identificar o processo que você quer matar. Pode-se usar tanto jobs ou ps, para fazer isso. Se usar jobs, isto retornará o número de processo. Com ps, retornara um ID de processo (PID). Vamos fazê-lo de duas formas:

[alex@linux alex]$ xload &
[1] 1292

[alex@linux alex]$ jobs
[1]+ Running xload &

[alex@linux alex]$  kill %1

[alex@linux alex]$  xload &
[2] 1293
[1] Terminated xload

[alex@linux alex]$ ps
PID TTY TIME CMD
1280 pts/5 00:00:00 bash
1293 pts/5 00:00:00 xload
1294 pts/5 00:00:00 ps

[alex@linux alex]$ kill 1293
[2]+ Terminated xload

[alex@linux alex]$ 


Um Pouco Mais Sobre kill

   Enquanto o comando kill é usado para "matar" os processos, o seu verdadeiro propósito é enviar códigos aos processos. Na maioria das vezes o sinal é para avisar o processo para parar a execução, mas há mais do que isso.
   Programas (se forem devidamente escrito) podem captar os sinais do sistema operacional e responder a eles, na maioria das vezes para permitir que algum método tenha um encerramento correto. 
   Por exemplo, um editor de texto pode captar qualquer sinal que indique que o usuário está fazendo logoff, ou que o computador está sendo desligado. Ao receber este sinal, ele salva o trabalho em andamento antes de sair. O comando kill pode enviar uma variedade de sinais. Digite ls para processar:


[alex@linux alex]$ kill -l


irá dar a você uma lista de sinais admissíveis. A maioria é bastante obscura, mas muitos são úteis de conhecer:

Sinal #NomeDescrição
1SIGHUPSinal para suspender o processo. Programas podem captar este sinal e agir (ou não) sobre isto.
2SIGINTSinal para Interromper. Este sinal é dada aos processos para interrompê-los. Os programas podem processar este sinal e agir sobre ela. Você também pode emitir o sinal diretamente digitando control-c na janela do terminal onde o programa está sendo executado.
15SIGTERMSinal para terminar. Este sinal é dado a processos para finalizá-los. Mais uma vez, os programas podem processar este sinal e agir sobre ela. Você também pode emitir o sinal diretamente digitando control-c na janela do terminal onde o programa está sendo executado. Este é o sinal padrão enviado pelo comando kill se nenhum sinal for especificado.
9SIGKILLSinal para Matar o processo. Este sinal causa o encerramento imediato do processo pelo kernel do Linux. Alguns programas podem se recusar a obedecer esse sinal.


Agora vamos supor que você tem um programa que está irremediavelmente travado  e você quer se livrar dele. Aqui está o que você faz:
  1. Utilizar o comando ps para obter o process id (PID) do processo o qual você deseja encerrar.
  2. Enviar um comando kill para este PID.
  3. Se o processo se recusar a encerrar (isto é, ele ignorar o sinal), enviar crescentes sinais rigorosos até que ele se encerre.
[alex@linux alex]$ ps x
PID TTY STAT TIME COMMAND
2931 pts/5 SN 0:00 netscape

[alex@linux alex]$ kill -SIGTERM 2931

[alex@linux alex]$ kill -SIGKILL 2931

No exemplo acima usou-se o comando kill de uma maneira formal. Na realidade da prática, é mais comum de fazê-lo da seguinte maneira desde que o sinal padrão enviado por matar é SIGTERM (que é o default) e matar também pode usar o número de sinal (-15) em vez do nome do sinal (SIGTERM):

[alex@linux alex]$ kill 2931

Então, se o processo não se encerrar, forçar a isto com o sinal SIGKILL (-9):

[alex@linux alex]$ kill -9 2931

That's it!

Nenhum comentário:

Postar um comentário