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&$ ps
PID 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$ ps
PID 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:
- Utilizar o comando
ps
para obter o ID do processo que queremos terminar. - Submeter um comando
kill
para esse PID. - 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_program
PID 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.