Dans bash
, vous devriez pouvoir faire:
kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')
Les détails de son fonctionnement sont les suivants:
- Le
ps
vous donne la liste de tous les processus.
- Les
grep
filtres basés sur votre chaîne de recherche [p]
sont une astuce pour vous empêcher de récupérer le grep
processus lui-même.
- Le
awk
juste vous donne le deuxième champ de chaque ligne, qui est le PID.
- La
$(x)
construction signifie exécuter x
puis prendre sa sortie et la mettre sur la ligne de commande. La sortie de ce ps
pipeline à l'intérieur de cette construction ci-dessus est la liste des ID de processus, vous vous retrouvez donc avec une commande comme kill 1234 1122 7654
.
Voici une transcription le montrant en action:
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
et vous pouvez le voir terminer tous les dormeurs.
Expliquant le grep '[p]ython csp_build.py'
bit un peu plus en détail:
Lorsque vous ne sleep 3600 &
suiviez par ps -ef | grep sleep
, vous avez tendance à deux processus avec sleep
en elle, la sleep 3600
et grep sleep
(parce qu'ils ont tous les deux sleep
en eux, ce n'est pas sorcier).
Cependant, ps -ef | grep '[s]leep'
ne créera pas de processus avec sleep
, il crée à la place grep '[s]leep'
et voici le bit délicat: le grep
ne le trouve pas car il recherche l'expression régulière "n'importe quel caractère de la classe de caractères [s]
(qui est s
) suivi par leep
.
En d'autres termes, il est à la recherche, sleep
mais le processus grep est celui grep '[s]leep'
qui ne s'y trouve pas sleep
.
Quand on me l'a montré (par quelqu'un ici sur SO), j'ai immédiatement commencé à l'utiliser parce que
- c'est un processus de moins que l'ajout
| grep -v grep
; et
- c'est élégant et sournois, une combinaison rare :-)