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
grepfiltri che in base alla stringa di ricerca,[p] sono un trucco per impedirti di raccogliere il grepprocesso stesso.
- Il
awk giusto ti dà il secondo campo di ogni riga, che è il PID.
- Il
$(x)costrutto significa eseguire xquindi prendere il suo output e inserirlo nella riga di comando. L'output di quella pspipeline 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 sleepin esso, il sleep 3600e il grep sleep(perché entrambi hannosleep in loro, questa non è scienza missilistica).
Tuttavia, ps -ef | grep '[s]leep'non creerà un processo con sleepal suo interno, crea invece grep '[s]leep'ed ecco il trucco: grepnon lo trova perché sta cercando l'espressione regolare "qualsiasi personaggio della classe di caratteri [s](che è s) seguito daleep .
In altre parole, sta cercando sleepma 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 :-)