Vou orientá-lo em um exemplo um tanto complexo, baseado em um cenário da vida real.
Problema
Digamos que o comando conky
parou de responder na minha área de trabalho e quero matá-lo manualmente. Conheço um pouco do Unix, então sei que o que preciso fazer é executar o comando kill <PID>
. Para recuperar o PID, posso usar ps
ou top
ou qualquer outra ferramenta que minha distribuição Unix me deu. Mas como posso fazer isso em um comando?
Responda
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
AVISO LEGAL: Este comando funciona apenas em certos casos. Não copie / cole no seu terminal e comece a usá-lo, pois isso pode matar os processos sem suspeitar. Em vez disso, aprenda como construí-lo .
Como funciona
1- ps aux
Este comando exibirá a lista de processos em execução e algumas informações sobre eles. A informação interessante é que ele produzirá o PID de cada processo em sua 2ª coluna. Aqui está um extrato da saída do comando na minha caixa:
$ ps aux
rahmu 1925 0.0 0.1 129328 6112 ? S 11:55 0:06 tint2
rahmu 1931 0.0 0.3 154992 12108 ? S 11:55 0:00 volumeicon
rahmu 1933 0.1 0.2 134716 9460 ? S 11:55 0:24 parcellite
rahmu 1940 0.0 0.0 30416 3008 ? S 11:55 0:10 xcompmgr -cC -t-5 -l-5 -r4.2 -o.55 -D6
rahmu 1941 0.0 0.2 160336 8928 ? Ss 11:55 0:00 xfce4-power-manager
rahmu 1943 0.0 0.0 32792 1964 ? S 11:55 0:00 /usr/lib/xfconf/xfconfd
rahmu 1945 0.0 0.0 17584 1292 ? S 11:55 0:00 /usr/lib/gamin/gam_server
rahmu 1946 0.0 0.5 203016 19552 ? S 11:55 0:00 python /usr/bin/system-config-printer-applet
rahmu 1947 0.0 0.3 171840 12872 ? S 11:55 0:00 nm-applet --sm-disable
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:38 conky -q
2- grep conky
Estou interessado apenas em um processo, então eu uso grep
para encontrar a entrada correspondente ao meu programa conky
.
$ ps aux | grep conky
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
rahmu 3233 0.0 0.0 7592 840 pts/1 S+ 16:55 0:00 grep conky
3- grep -v grep
Como você pode ver na etapa 2, o comando ps
gera o grep conky
processo em sua lista (afinal, é um processo em execução). Para filtrá-lo, eu posso correr grep -v grep
. A opção -v
indica grep
para corresponder a todas as linhas, excluindo as que contêm o padrão.
$ ps aux | grep conky | grep -v grep
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
NB: Eu adoraria saber uma maneira de executar as etapas 2 e 3 em uma única grep
chamada.
4- awk '{print $2}'
Agora que eu isolei meu processo de destino. Eu quero recuperar seu PID. Em outras palavras, quero recuperar a segunda palavra da saída. Para minha sorte, a maioria (todos?) Dos escritórios modernos fornecerá uma versão de awk
uma linguagem de script que faz maravilhas com dados tabulares. Nossa tarefa se torna tão fácil quanto print $2
.
$ ps aux | grep conky | grep -v grep | awk '{print $2}'
1948
5- xargs kill
Eu tenho o PID. Tudo que eu preciso é passar para kill
. Para fazer isso, eu vou usar xargs
.
xargs kill
lerá da entrada (no nosso caso, do canal), formará um comando que consiste em kill <items>
( <items>
seja o que for que for lido da entrada) e, em seguida, execute o comando criado. No nosso caso, ele será executado kill 1948
. Missão cumprida.
Palavras finais
Observe que, dependendo da versão do unix que você está usando, determinados programas podem se comportar de maneira um pouco diferente (por exemplo, ps
pode gerar o PID na coluna $ 3). Se algo parecer errado ou diferente, leia a documentação do seu fornecedor (ou melhor, as man
páginas). Também tenha cuidado, pois tubos longos podem ser perigosos. Não faça suposições, especialmente ao usar comandos como kill
ou rm
. Por exemplo, se houvesse outro usuário chamado 'conky' (ou 'Aconkyous'), meu comando também poderia matar todos os seus processos em execução!
O que estou dizendo é ter cuidado, especialmente para tubos longos. É sempre melhor construí-lo interativamente, como fizemos aqui, do que fazer suposições e sentir pena depois.