domingo, 24 de abril de 2011

Matando processos (encerrando programas que não respondem)

Boa noite a todos,

Trago algo bacana que aprendi esses dias.

Algumas vez você deve ter se deparado com algum programa que, após algum tempo de uso, travou sem mais, nem menos. Simplesmente a janela ficou acinzentada e nada era processado. Isso é comum em programas em fase de testes. Recentemente aconteceu comigo quando testava o novo emesene http://emesene.org/.

O que poderia ser feito?

O comando ps, seguido dos parâmetros aux

$ ps aux (Mais detalhes, acesse ao manpage através do comando man ps)

exibe os processos atualmente sendo executados.

Agora, você pode filtrar por um termo que esteja buscando, utilizando um pipe | seguido por um filtro, com o auxílio do grep. No meu caso, emesene, assim:

$ ps aux | grep emesene

Caso o comando encontre o processo em execução, no caso o do programa emesene, então, serão retornadas duas linhas. A primeira com o processo referente ao emesene. A segunda, referente ao comando executado há pouco.

Para que apenas o primeiro seja exibido, você pode ainda utilizar o comando head com o parâmetro -n 1, que quer dizer, exibir apenas as -n primeiras linhas. No caso, apenas 1 linha:

$ ps aux | grep emesene | head -n 1

Agora, utilizando o comando cut, podemos "cortar" a linha retornada em diversas colunas, segundo algum "critério separador". Na verdade, delimitador, identificado pelo parâmetro -d. Vamos utilizar o espaço em branco: -d ' '. Em seguida, é preciso informar que coluna(s) deseja exibir, com o parâmetro -f. Se fornecermos o parâmetro -f 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, o comando irá exibir as colunas 1, 2, ..., 10 do texto retornado. No nosso caso, o número do processo será encontrado na coluna 4. Então, precisamos apenas de -f 4. Veja como fica agora

$ ps aux | grep emesene | head -n 1 | cut -d ' ' -f 4

Esse comando retorna apenas o número do processo referente ao programa emesene.

Poderíamos atribuir a saída deste comando a uma variável:

$ processo=`ps aux | grep emesene | head -n 1 | cut -d ' ' -f 4`

ou

$ processo=$(ps aux | grep emesene | head -n 1 | cut -d ' ' -f 4)

Se você, neste momento, solicitar ao terminal que exiba o conteúdo da variável que acabou de criar, chamada processo, com o comando

$ echo $processo

Então, será exibido o número do processo armazenado por esta variável.

Agora, podemos chamar o comando kill, seguido do processo que desejamos matar.

$ kill $processo

Não sei aí, mas aqui, o emesene "morreu", encerrou, fechou, ou como queira chamar =)

Uma maneira mais rápida, mas não tão eficiente, de encerrar um processo pode ser feito utilizando o comando killall, cuja função é matar um processo, recebendo um nome como parâmetro. Dessa forma, nosso comando ficaria simplesmente assim:

$ killall emesene

Mas por que cargas d'água eu não disse isso antes? É que eu queria mostrar através do exemplo, outros comandos, que podem ser úteis, como o cut, o head, o grep, assim como diversos outros.

É importante se familiarizar com alguns comandos do GNU/Linux, pois eles podem te salvar, em situações em que, por exemplo, você não soubesse que, clicando com o botão direito no painel superior, no GNOME, e em seguida, Adicionar ao Painel, existe um applet (procure algo como force quit ou forçar...), que, quando você clica nele, é possível encerrar algum programa clicando em seguida no programa. Entendeu? Enfim, era isso...

Até a próxima

Nenhum comentário:

Postar um comentário