sábado, 31 de julho de 2010

Várias Maneiras de Matar uma Aplicação

A verdade é a seguinte: embora o Kernel do Linux seja a coisa mais estável do mundo (impressionantemente estável como poucas coisas na vida!!), as aplicações que nós rodamos muitas vezes não têm esta mesma propriedade (nem tempo de desenvolvimento, já que o Kernel é de fato bem velhinho...). Assim, acontece o inesperado: as aplicações travam!! E a gente tem que pedir ao Kernel que as "mate", ou seja, interrompa os seus processos, nem que seja bruscamente, e recupere (às vezes chamado "reivindique") a memória usada por elas. Não preciso nem dizer que, o que quer que estes programas estejam fazendo, vai para o espaço, e, uma vez tendo a memória que ocupam ao rodarem reivindicada, eles viram meras vagas lembranças...
Bom, este é o cenário deste artigo: como matar um programa no Linux?? As instruções servem tanto para programas rodando normalmente quanto para aqueles que travaram e não respondem. Qualquer programa pode ser matado porque quem mata é o Kernel, e com o Kernel ninguém pode (lembrem-se de que estamos falando de sistemas de verdade, e não de sistemas com falhas de proteção entre as camadas básicas, como o Windows e alguns sistemas embarcados muito simples...)


  • Matando Bruscamente

Matar bruscamente um programa é a última coisa que fazemos, recurso somente utilizado quando nada mais é possível e o programa não responde mais. A maneira mais simples é digitar o comando kill. Este comando precisa do argumento referente ao PID (identificador do processo) do programa e do tipo de sinal a ser enviado. Para achar o PID de seu programa, veja o número da primeira coluna deste comando:

ps -e

(a opção "-e" exige que se mostrem todos os processos).
Em geral isto exibe uma lista enorme. Então, se você sabe qual programa matar, resuma a saída com o comando grep (exemplo, vamos matar o kedit):

ps -e | grep kedit
20128 pts/0 00:00:00 kedit

Viu?? Apenas uma linha, que informa que o PID do kedit é 20128. Felizmente, só temos uma instância do kedit rodando. Agora vamos matar esse camarada (coitado, aqui ele tava rodando direitinho, mas foi eleito como bode expiatório deste tutorial... a vida nem sempre é justa...):

kill -9 20128

Isto mata exatamente aquela instância. Se houver mais de uma instância do kedit, elas terão identificadores diferentes (PIDs diferentes) e você conseguirá matar apenas a instância que você quer. Não se esqueça de usar o "-9", pois esta opção indica ao Kernel que realmente mate o programa, ou seja, que envie o sinal denominado "SIGKILL" para o processo.
Peraí!! O que é esse negócio de sinal?? É a maneira como o Kernel elenca os estados dos processos, e sabe o que fazer com cada um. Existem diversos estados, apesar de quase nunca precisarmos pensar nisso... mas o Kernel precisa controlar os sinais para que seus componentes saibam como tratar o processo. Por isso, o comando kill, apesar do nome, nunca mata realmente o processo, mas apenas solicita ao Kernel que troque o estado daquele programa, ou seja, que envie um determinado sinal para ele, o referente à sua morte, seu letal fim...
Quer saber quantos sinais existem?? Digite:

kill -l
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 16) SIGSTKFLT
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 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

Sua lista de sinais vai ser parecida com esta acima... Ainda bem que o Kernel gerencia isto tudo sozinho...


  • Matando Graficamente



ProcessTable: o gerenciador de processos do KDE.

Se você usa o KDE, então existe uma maneira de matar graficamente um aplicativo!! Aperte CTRL + ESC. Isto abrirá o ProcessTable, o gerenciador de processos gráfico do KDE. Identifique o nosso bode expiatório (kedit) na tabela, clique nele e aperte o botão "matar".
O ProcessTable faz o mesmo que o comando kill, porém de forma gráfica. Se essa for a sua preferência e se houver interface gráfica rodando, o procedimento pode ser feito tranqüilamente desta maneira sem nenhuma perda de eficiência.


  • Quem Pode Matar??

Todos os usuário podem matar seus processos, ou seja, não precisa ser root para matar um processo. No entanto, um usuário sem preferências de administrador não pode matar o processo do outro. Apenas o root (ou alguém com privilégios como tal) pode matar qualquer processo da máquina, porque, afinal de contas, o root é o root...


  • Matando Suavemente Um Serviço

Muitos programas, como deamons e serviços, têm toda uma rotina de clean-up (descarrego e limpeza) que é executada ao ser descarregado. Normalmente estas rotinas ficam em scripts e mesmo os scripts de shutdown do sistema (desligamento) estão encadeados em ordem, de forma que um só pode ser executado ao final da conclusão de outro. Para permitir uma morte mais limpa a estes programas especiais e evitar que, por algum motivo (e isto já vi várias vezes!!), o desligamento da máquina páre bruscamente no meio do procedimento, caindo num terminal em modo texto, esperando a conclusão de um processo que pendurou e nunca vai terminar, é possível fazer uma morte suave, mais tranqüila, que não interrompe o descarrego do serviço (e do sistema, conseqüentemente).
Vamos supor que o KDM tenha travado durante o desligamento do sistema. Assim, precisamos matá-lo. Porém, o seu processo implica em scripts que, se forem interrompidos bruscamente, como o foram, paralizam o desligamento, caindo num terminal em modo texto. Então, matamos o KDM desta maneira:

ps -e | grep kdm
2882 ? 00:00:00 kdm
kill -HUP 2882

A opção "-HUP" concede ao KDM uma morte suave, talvez até com opção de realizar o último desejo...


  • Matando de uma vez Todas as Instâncias de uma Aplicação

Se você tem várias instâncias de uma aplicação e quer matar todas elas, ou mesmo se só tem uma instância, mas não quer se preocupar em buscar o PID da mesma, basta usar o comando killall. Vamos ao exemplo, matando nosso pobre kedit:

killall kedit

Dessa, nenhum kedit que o referido usuário esteja rodando escapa...
CUIDADO: se você digitar um comando como este usando privilégios de root, você vai matar todas as instâncias de todos os usuários do referido programa, o que pode causar problemas sérios, especialmente se estiver no contexto de um servidor...


  • Resumindo...

Existem várias maneiras de se matar aplicativos no Linux. A notícia boa é que, por mais que as aplicações travem, o sistema é estável, permitindo-se recuperar o controle. Usar um método ou outro depende de sua situação: um usuário doméstico, rodando sobre interface gráfica, tenderá a considerar cômodo o ProcessTable. Um administrador de sistemas, logado remotamente e preocupado com os serviços que precisa manter no ar, vai mergulhar nas opções dos comandos kill e ps. Em suma: a gama de opções nos dá ferramentas para o uso mais apropriado em diversas situações.

Gostou deste tutorial?? Ajudou em alguma coisa?? Detestou completamente???? Então: COMENTE!!!!!!

Nenhum comentário: