Vou orientar você em um exemplo um tanto complexo, com base em um cenário da vida real.
Problema
Digamos que o comando conky
parou de responder na minha área de trabalho e eu quero eliminá-lo manualmente. Eu 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 ferramenta que minha distribuição Unix tenha me dado. Mas como posso fazer isso em um comando?
Resposta
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
AVISO LEGAL: Este comando só funciona em certos casos. Não copie / cole no seu terminal e comece a usá-lo, ele pode matar processos sem suspeita. Em vez disso, aprenda como criá-lo .
Como funciona
1 ps aux
Este comando irá mostrar a lista de processos em execução e algumas informações sobre eles. A informação interessante é que ele irá mostrar o PID de cada processo em sua segunda 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, por isso 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
gerará o processo grep conky
em sua lista (afinal, é um processo em execução). Para filtrar, posso executar 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 chamada grep
.
4 awk '{print $2}'
Agora que isolei meu processo de segmentação. Eu quero recuperar seu PID. Em outras palavras, quero recuperar a segunda palavra da saída. Para minha sorte, a maioria (todos?) Dos unices modernos fornecerão alguma versão do 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 preciso é passá-lo para kill
. Para fazer isso, usarei xargs
.
xargs kill
lerá a entrada (no nosso caso a partir do canal), formará um comando consistindo de kill <items>
( <items>
são o que for lido na entrada) e, em seguida execute o comando criado. No nosso caso, ele executará kill 1948
. Missão cumprida.
Palavras finais
Observe que, dependendo da versão do unix que você está usando, alguns 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 houver outro usuário chamado 'conky' (ou 'Aconkyous'), meu comando também pode matar todos os processos em execução dele!
O que estou dizendo é que seja cuidadoso, especialmente para tubos longos. É sempre melhor construí-lo interativamente como fizemos aqui, do que fazer suposições e lamentar mais tarde.