Question Trouver et tuer un processus dans une ligne en utilisant bash et regex


J'ai souvent besoin de tuer un processus pendant la programmation.

La façon dont je le fais maintenant est:

[~]$ ps aux | grep 'python csp_build.py'
user    5124  1.0  0.3 214588 13852 pts/4    Sl+  11:19   0:00 python csp_build.py
user    5373  0.0  0.0   8096   960 pts/6    S+   11:20   0:00 grep python csp_build.py
[~]$ kill 5124

Comment puis-je extraire l'ID de processus automatiquement et le tuer dans la même ligne?

Comme ça:

[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>

494
2017-08-18 09:33


origine


Réponses:


Dans bash, vous devriez pouvoir faire:

kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')

Les détails sur son fonctionnement sont les suivants:

  • le ps vous donne la liste de tous les processus.
  • le grep des filtres basés sur votre chaîne de recherche, [p] est un truc pour vous empêcher de ramasser le réel grep processus lui-même.
  • le awk vous donne juste le deuxième champ de chaque ligne, qui est le PID.
  • le $(x) construire signifie exécuter x puis prenez sa sortie et mettez-la sur la ligne de commande. La sortie de cette ps pipeline à l'intérieur de cette construction ci-dessus est la liste des ID de processus de sorte que vous vous retrouvez 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 se terminant tous les dormeurs.


Expliquer le grep '[p]ython csp_build.py' peu dans un peu plus de détails:

Quand tu fais sleep 3600 & suivi par ps -ef | grep sleep, vous avez tendance à avoir deux processus avec sleep en cela, le sleep 3600 et le grep sleep (parce qu'ils ont tous les deux sleep chez eux, ce n'est pas sorcier).

cependant, ps -ef | grep '[s]leep' ne créera pas de processus avec sleep en elle, il crée plutôt grep '[s]leep' et voici le peu difficile: le grep ne le trouve pas car il recherche l'expression régulière "tout caractère de la classe de caractères [s] (lequel est s) suivi par leep.

En d'autres termes, il cherche sleep mais le processus de grep est grep '[s]leep' qui n'a pas sleep dedans.

Quand on m'a montré ceci (par quelqu'un ici sur SO), j'ai immédiatement commencé à l'utiliser parce que

  • c'est un processus de moins que d'ajouter | grep -v grep; et
  • c'est élégant et sournois, une combinaison rare :-)

1097
2017-08-18 09:53



si tu as pkill,

pkill -f csp_build.py

Si vous voulez seulement grep contre le nom du processus (au lieu de la liste complète des arguments), alors laissez tomber -f.


98
2017-08-18 10:56



Bon mot:

ps aux  |  grep -i csp_build  |  awk '{print $2}'  |  xargs sudo kill -9
  • Imprimez la colonne 2: awk '{print $2}' 
  • sudo est optionnel
  • Courir kill -9 5124, kill -9 5373 etc (kill -15 est plus gracieux mais légèrement plus lent)

Prime:

J'ai aussi 2 fonctions de raccourci définies dans mon fichier .bash_profile (~ / .bash_profile est pour osx, vous devez voir ce qui fonctionne pour votre machine * nix).

  1. p  mot-clé
    • liste tous Pprocessus contenant le mot-clé
    • utilisation par exemple: p csp_build , p python etc

code bash_profile:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}
  1. ka  mot-clé
    • Kdes maux UNEll processus qui ont ce mot-clé
    • utilisation par exemple: ka csp_build , ka python etc
    • niveau de suppression optionnel, par exemple: ka csp_build 15, ka python 9

code bash_profile:

# KILL ALL
function ka(){

    cnt=$( p $1 | wc -l)  # total count of processes found
    klevel=${2:-15}       # kill level, defaults to 15 if argument 2 is empty

    echo -e "\nSearching for '$1' -- Found" $cnt "Running Processes .. "
    p $1

    echo -e '\nTerminating' $cnt 'processes .. '

    ps aux  |  grep -i $1 |  grep -v grep   | awk '{print $2}' | xargs sudo kill -klevel
    echo -e "Done!\n"

    echo "Running search again:"
    p "$1"
    echo -e "\n"
}

55
2018-05-27 14:57



Essayez d'utiliser

ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill

12
2017-08-18 09:57



killall -r regexp

-r, --regexp

Interprète le modèle de nom de processus en tant qu'expression régulière étendue.


11
2017-11-28 11:38



Vous ne pouvez utiliser que pkill '^python*' pour tuer le processus regex.

Si vous voulez voir ce que vous allez tuer ou trouver avant de tuer, utilisez pgrep -l '^python*' où -l renvoie également le nom du processus. Si vous ne voulez pas utiliser pkill, utilisez juste:

pgrep '^python*' | xargs kill


9
2017-11-20 11:38



vous pouvez le faire avec awk et backtics

ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`

$ 2 in awk imprime la colonne 2, et les backtics exécutent l'instruction imprimée.

Mais une solution beaucoup plus propre serait pour le processus python de stocker son identifiant de processus dans / var / run et ensuite vous pouvez simplement lire ce fichier et le tuer.


5
2017-08-18 09:42



Utilisez pgrep - disponible sur de nombreuses plates-formes:

kill -9 `pgrep -f cps_build`

pgrep -f retournera tous les PID avec coïncidence "cps_build"


5
2017-11-22 16:31



Ma tâche était de tuer tout ce qui correspond à regexp qui est placé dans un répertoire spécifique (après les tests de sélénium, tout ne s'arrêtait pas). Cela a fonctionné pour moi:

for i in `ps aux | egrep "firefox|chrome|selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done

4
2017-10-10 13:55



Pour tuer le processus par mot clé midori, par exemple:

kill -SIGTERM $(pgrep -i midori)


4
2018-03-16 18:16



Une méthode utilisant uniquement awk (et ps):

ps aux | awk '$11" "$12 == "python csp_build.py" { system("kill " $2) }'

En utilisant des tests d'égalité de chaînes, j'empêche de faire correspondre ce processus lui-même.


3
2017-08-18 09:48