In bash
, dovresti essere in grado di fare:
kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')
I dettagli sul suo funzionamento sono i seguenti:
- Il
ps
ti dà la lista di tutti i processi.
- I
grep
filtri che in base alla stringa di ricerca,[p]
sono un trucco per impedirti di raccogliere il grep
processo stesso.
- Il
awk
giusto ti dà il secondo campo di ogni riga, che è il PID.
- Il
$(x)
costrutto significa eseguire x
quindi prendere il suo output e inserirlo nella riga di comando. L'output di quella ps
pipeline all'interno di quel costrutto sopra è la lista degli ID di processo in modo da finire con un comando similekill 1234 1122 7654
.
Ecco una trascrizione che lo mostra in azione:
pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+ Terminated sleep 3600
[1] Terminated sleep 3600
[2] Terminated sleep 3600
[3]- Terminated sleep 3600
[4]+ Terminated sleep 3600
e puoi vederlo terminare tutti i dormienti.
Spiegare il grep '[p]ython csp_build.py'
bit in modo un po 'più dettagliato:
Quando lo fai sleep 3600 &
seguito ps -ef | grep sleep
, tendi ad avere due processi con sleep
in esso, il sleep 3600
e il grep sleep
(perché entrambi hannosleep
in loro, questa non è scienza missilistica).
Tuttavia, ps -ef | grep '[s]leep'
non creerà un processo con sleep
al suo interno, crea invece grep '[s]leep'
ed ecco il trucco: grep
non lo trova perché sta cercando l'espressione regolare "qualsiasi personaggio della classe di caratteri [s]
(che è s
) seguito daleep
.
In altre parole, sta cercando sleep
ma il processo grep è grep '[s]leep'
che non hasleep
in esso.
Quando mi è stato mostrato questo (da qualcuno qui su SO), ho immediatamente iniziato a usarlo perché
- è un processo in meno rispetto all'aggiunta
| grep -v grep
; e
- è elegante e subdolo, una combinazione rara :-)