Ti guiderò attraverso un esempio piuttosto complesso, basato su uno scenario di vita reale.
Problema
Diciamo che il comando ha conky
smesso di rispondere sul mio desktop e voglio ucciderlo manualmente. Conosco un po 'Unix, quindi so che quello che devo fare è eseguire il comando kill <PID>
. Al fine di recuperare il PID, posso usare ps
o top
o qualunque strumento mia distribuzione Unix mi ha dato. Ma come posso farlo in un solo comando?
Risposta
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
NOTA BENE: questo comando funziona solo in alcuni casi. Non copiarlo / incollarlo nel tuo terminale e iniziare a usarlo, potrebbe uccidere i processi in modo ignaro. Piuttosto impari come costruirlo .
Come funziona
1- ps aux
Questo comando mostrerà l'elenco dei processi in esecuzione e alcune informazioni su di essi. Le informazioni interessanti sono che produrrà il PID di ogni processo nella sua seconda colonna. Ecco un estratto dall'output del comando sulla mia scatola:
$ 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
Sono interessato a un solo processo, quindi utilizzo grep
la voce corrispondente al mio programma 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
Come puoi vedere nel passaggio 2, il comando ps
genera il grep conky
processo nel suo elenco (dopo tutto è un processo in esecuzione). Per filtrarlo, posso eseguire grep -v grep
. L'opzione -v
dice grep
di abbinare tutte le linee escludendo quelle che contengono il modello.
$ ps aux | grep conky | grep -v grep
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
NB: Mi piacerebbe conoscere un modo per eseguire i passaggi 2 e 3 in una singola grep
chiamata.
4- awk '{print $2}'
Ora che ho isolato il mio processo target. Voglio recuperare il suo PID. In altre parole, voglio recuperare la seconda parola dell'output. Fortunatamente per me, la maggior parte dei (tutti?) Gli unici moderni fornirà una versione di awk
, un linguaggio di scripting che fa miracoli con dati tabulari. Il nostro compito diventa facile come print $2
.
$ ps aux | grep conky | grep -v grep | awk '{print $2}'
1948
5- xargs kill
Ho il PID. Tutto ciò di cui ho bisogno è passarlo a kill
. Per fare questo, userò xargs
.
xargs kill
leggerà dall'input (nel nostro caso dalla pipe), formerà un comando costituito da kill <items>
( <items>
sono qualunque cosa abbia letto dall'input), e quindi eseguirà il comando creato. Nel nostro caso verrà eseguito kill 1948
. Missione compiuta.
Parole finali
Si noti che a seconda della versione di unix in uso, alcuni programmi potrebbero comportarsi in modo leggermente diverso (ad esempio, ps
potrebbe generare il PID nella colonna $ 3). Se qualcosa sembra sbagliato o diverso, leggi la documentazione del tuo fornitore (o meglio, le man
pagine). Inoltre, fai attenzione perché i tubi lunghi possono essere pericolosi. Non fare ipotesi soprattutto quando si usano comandi come kill
o rm
. Ad esempio, se ci fosse un altro utente chiamato "conky" (o "Aconkyous") il mio comando potrebbe anche uccidere tutti i suoi processi in esecuzione!
Quello che sto dicendo è fare attenzione, soprattutto per le pipe lunghe. È sempre meglio costruirlo interattivamente come abbiamo fatto qui, piuttosto che fare ipotesi e sentirsi dispiaciuto in seguito.