Controle de trabalhos

Home |

Anterior | Conteúdo | Próximo

Na lição anterior, vimos algumas das implicações do sistema operacional Linux beinga multi-usuário. Nesta lição, vamos examinar a multitaskingnature do Linux, e como ele é controlado com a interface de linha de comando.

Como em qualquer sistema operacional multitarefa, o Linux executa processos múltiplos e simultâneos. Bem, eles aparecem simultâneos, de qualquer forma. Na verdade, o núcleo único do processador só pode executar um processo de cada vez, mas o Linuxkernel consegue dar a cada processo a sua vez no processador e cada um parece estar rodando ao mesmo tempo.

Existem vários comandos que são usados para controlar os processos. Eles são:

  • ps – lista os processos em execução no sistema
  • kill – envia um sinal para um ou mais processos (normalmente para “matar” um processo)
  • jobs – uma forma alternativa de listar seus próprios processos
  • bg – colocar um processo em segundo plano
  • fg – colocar um processo em primeiro plano

Um exemplo prático

Embora possa parecer que este assunto é bastante obscuro, pode ser verossímil para o utilizador médio que trabalha principalmente com a interface gráfica de utilizador. Embora possa não ser aparente, a maioria (se não todos) dos programas gráficos podem ser lançados a partir da linha de comando. Aqui está um exemplo: há um pequeno programa fornecido com o sistema X Window chamado xload que exibe um gráfico representando a carga do sistema. Wecan execute este programa digitando o seguinte:

$ xload

Note que a pequena janela xload aparece e começa a mostrar o gráfico de carga do sistema. Em sistemas onde xload não está disponível, tente gedit em vez disso. Note também que nosso prompt não reapareceu após o lançamento do programa. A shell está à espera que o programa termine antes do controlreturns. Se fecharmos a janela xload, o programa xload termina e o prompt retorna.

Putting a Program into the Background

Agora, para facilitar um pouco a vida, vamos lançar o programa xload novamente, mas desta vez vamos colocá-lo em background para que o prompt retorne. Para fazer isso, executamos xload como:

$ xload & 1223$

Neste caso, o prompt retornou porque o processo foi colocado em background.

Agora imagine que esquecemos de usar o símbolo “&” para colocar o programa em background. Ainda há esperança. Podemos digitar Ctrl-z e o processo será suspenso. Podemos verificar isso vendo que a janela de oscilação do programa está congelada. O processo ainda existe, mas está ocioso. Para retomar o processo em segundo plano, digite o comando bg (abreviação de forbackground). Aqui está um exemplo:

>

$ xload+ xload parado$ bg+ xload &

Listing Running Processes

Agora temos um processo em segundo plano, seria útil exibir uma lista dos processos que lançamos. Para isso, podemos usar ou o comandojobs ou o comando mais poderoso ps.

$ jobs+ Executando xload&$ psPID TTY TIME CMD1211 pts/4 00:00:00:00 bash1246 pts/4 00:00:00 xload1247 pts/4 00:00:00 ps$

Killing a Process

Suponha que temos um programa que não responde; como nos livramos dele? Usamos o comando kill, é claro. Vamos tentar isto em xload. Primeiro, precisamos identificar o processo que queremos matar. Podemos usar ou jobs ou ps, para fazer isso. Se usarmos trabalhos, teremos de volta um número de trabalho. Com ps, recebemos uma identificação do processo (PID). Vamos fazê-lo bothways:

$ xload & 1292$ jobs+ Executando xload&$ kill %1$ xload & 1293 Terminado xload$ psPID TTY TIME CMD1280 pts/5 00:00:00:00 bash1293 pts/5 00:00:00 xload1294 pts/5 00:00:00 ps$ kill 1293+ Terminado xload$

Um pouco mais sobre matar

Embora o comando kill seja usado para “matar” processos, seu propósito real é enviar sinais para processos. Na maioria das vezes o sinal tem a intenção de dizer ao processo para ir embora, mas há mais do que isso. Os programas (se forem escritos corretamente) escutam os sinais do sistema operacional e respondem a eles, na maioria das vezes para permitir um método somegracioso de terminação. Por exemplo, um editor de texto pode ouvir qualquer sinal que indique que o usuário está se desligando, ou que o computador está desligando. Quando recebe esse sinal, ele pode salvar o trabalho em progresso antes de sair. O comando kill pode enviar uma variedade de sinais para os processos. Digitando:

kill -l

irá imprimir uma lista dos sinais que ele suporta. Muitos são bastante obscuros, mas vários são úteis para saber:

Sinal # Nome Descrição
1 SIGHUP Desligar o sinal. Os programas podem ouvir este sinal e agir sobre ele. Este sinal é enviado para processos em execução em um terminal quando você fecha o terminal.
2 SIGINT Interromper o sinal. Este sinal é dado aos processos para interrompê-los. Os programas podem processar este sinal e agir sobre ele. Também podemos emitir este sinal diretamente digitando Ctrl-c na janela do terminal onde o programa está sendo executado.
15 SIGTERM Sinal de terminação. Este sinal é dado aos processos para terminá-los. Novamente, os programas podem processar este sinal e agir sobre ele. Este é o sinal padrão enviado pelo comando kill se nenhum sinal for especificado.
9 SIGKILL Kill signal. Este sinal causa a terminação imediata do processo pelo kernel do Linux. Os programas não podem ouvir este sinal.

Agora vamos supor que temos um programa que está irremediavelmente pendurado e que queremos nos livrar dele. Eis o que fazemos:

  1. Utilizar o comando ps para obter o ID do processo que queremos terminar.
  2. Submeter um comando kill para esse PID.
  3. Se o processo se recusar a terminar (ou seja está ignorando o sinal), envie sinais cada vez mais severos até que ele termine.
$ ps x | grep bad_programPID TTY STAT TIME COMMAND2931 pts/5 SN 0:00 bad_program$ kill -SIGTERM 2931$ kill -SIGKILL 2931

No exemplo acima usamos o comando ps com a opção x para listar todos os nossos processos (mesmo aqueles não lançados a partir do terminal atual). Além disso, nós pipedamos a saída do comando ps para grep para listar apenas o programa em que estamos interessados. Em seguida, usamos kill para emitir um sinal SIGTERM para o programa problemático.Na prática real, é mais comum fazê-lo da seguinte forma, uma vez que o sinal predefinido enviado por kill é SIGTERM e kill também pode usar o número do sinal em vez do nome do sinal:

$ kill 2931

Então, se o processo não terminar, forceit com o sinal SIGKILL:

$ kill -9 2931

É isso!

Esta conclui a série de lições “Aprendendo a Shell”. Na série nextseries, “Writing Shell Scripts”, veremos como automatizar tarefas com o Shell.

>Outra Leitura

  • Para um tratamento mais aprofundado do tópico, veja o Capítulo 10 em The Linux Command Line.
  • 1963 Timesharing: A Solution to Computer Bottlenecks, um fascinante vídeo do YouTube do Computer History Museum descrevendo o primeiro sistema operacional de timesharing e como ele funciona. É basicamente o mesmo método usado por todos os computadores modernos.
Topo | Anterior | Índice | Próximo

Deixe uma resposta

O seu endereço de email não será publicado.