Vou orientá-lo em um exemplo um tanto complexo, baseado em um cenário da vida real.
Problema
Digamos que o comando conkyparou 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 psou topou 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 greppara 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 psgera o grep conkyprocesso em sua lista (afinal, é um processo em execução). Para filtrá-lo, eu posso correr grep -v grep. A opção -vindica greppara 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 grepchamada.
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 awkuma 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 killlerá 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, pspode gerar o PID na coluna $ 3). Se algo parecer errado ou diferente, leia a documentação do seu fornecedor (ou melhor, as manpáginas). Também tenha cuidado, pois tubos longos podem ser perigosos. Não faça suposições, especialmente ao usar comandos como killou 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.