Mostrando postagens com marcador gnu. Mostrar todas as postagens
Mostrando postagens com marcador gnu. Mostrar todas as postagens

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