Trouver l'ID d'un processus et le tuer


16

Chaque fois que je dois tuer un processus d'arrière-plan, je le fais ps -e | grep <process_name>

Qui imprime quelque chose comme ça 1766 ? 00:00:13 conky, puis j'utilise l'ID de processus killcomme ça kill 1766.

Existe-t-il un moyen de simplifier cela? Rendez-vous plus rapide? réduire la quantité de frappe?


1
J'ai obtenu la réponse que je veux, mais j'attendrai un moment avant d'accepter Pour que la communauté puisse bénéficier des différentes options disponibles.
Gautam

N'hésitez pas à rendre cette question plus générique si possible afin que plus de personnes puissent bénéficier des réponses
Gautam

Réponses:


19

(TL, DR: pgrep, pkill)

De nombreuses variantes Unix sont fournies avec pgrepet son compagnon pkill: Solaris , Linux (qui fait partie des utilitaires de processus standard , peut être absent des systèmes Linux embarqués), FreeBSD , OpenBSD , NetBSD ,… mais uniquement à partir de MacPorts sur OS X , pas AIX , et seulement récemment dans HP-UX . L' pgreputilitaire affiche l'ID de processus des processus correspondant par nom, utilisateur et quelques autres critères. L'argument to pgrepest interprété comme une expression rationnelle qui doit correspondre à une partie du nom de l'exécutable du processus (à moins que vous ne passiez une option pour le modifier). Si vous appelez pkillau lieu depgrep, l'utilitaire envoie un signal au lieu d'afficher les ID de processus.

Un autre utilitaire similaire est pidof . Sous Linux , il est fourni par SysVinit ou BusyBox (vous le trouverez donc souvent sur un système Linux embarqué qui n'en a pas pgrep); il existe également des ports sur d'autres variantes d'Unix. L' pidofutilitaire a moins d'options, il ne correspond généralement qu'à des noms de fichiers exécutables entiers. Son utilitaire compagnon killallenvoie un signal aux programmes correspondants¹.

¹ Méfiez-vous qui killalla une signification différente sur Solaris et peut-être d'autres variantes d'Unix; ne saisissez pas en killalltant que root sur Solaris.


Wow votre réponse est très détaillée, beaucoup plus en profondeur, merci. Veuillez modifier la question pour qu'elle corresponde à la réponse si possible.
Gautam

@GautamK Je ne pense pas que la question doive être développée. Si vous le faites, n'hésitez pas à le modifier vous-même.
Gilles 'SO- arrête d'être méchant'

Parmi les réponses avec le plus de votes Votre réponse donne plus de détails, donc je l'accepte
Gautam

8
  • killall ProcessName (cette commande présente un inconvénient dans la mesure où vous ne connaissez pas toujours le nom de processus d'un programme).
  • pidof ProccessName et kill the result form pidof
  • ps xu | grep <process name> | grep -v grep | awk '{ print $2 }' | xargs kill -9 Essayez cette seule ligne et réutilisez-la dans l'historique de votre bash, ou mieux créez un alias pour elle.

Le second pidofsemble un peu plus facile, mais il faut tout de même 2 étapes
Gautam

Je peux rechercher / créer une commande d'une ligne qui le fait en une seule étape (avec un nom de processus approximatif), mais cela vous obligerait à taper une longue ligne (ce qui est plus difficile que les deux étapes ci-dessus), ou vous pouvez la taper une fois et le réutiliser forment l'histoire.
Hanan N.

@GautamK j'ai mis à jour la réponse avec l'option de commande unique.
Hanan N.

6

Bien que Hanan ait de bonnes suggestions, j'ajouterai pgrep/ pkill. Ils permettent un contrôle beaucoup plus fin du processus que vous trouvez et des expressions régulières si vous ne connaissez pas le processus précis que vous devrez tuer.

PS Hanan pidofpeut être alimenté killdirectement avec des backticks:

kill `pidof processname`

pkillétait exactement ce que je cherchais, je connais la plupart du temps le nom du processus, principalement son conkyou firefoxou chromeou quelque chose comme ça. Merci
Gautam

1

Que dis-tu de ça -

ps -e | awk '$4~/<process name>/{print $1}' | xargs kill

Exemple:

[jaypal:~/Temp] sleep 100&
[1] 74863
[jaypal:~/Temp] ps -e | awk '$4~/sleep/{print $1}' | xargs kill
[1]+  Terminated: 15          sleep 100

Mise à jour:

Désolé, cela ne répond évidemment pas à l'exigence de moins de frappe, donc une bonne façon de le faire serait d'ajouter un functionà votre .bashrc, .profileou quel que soit le script de démarrage. La fonction peut être quelque chose comme ça -

killp() {
awk -v pname="$1" '($4==pname){print $1}' <(ps -e) | xargs kill
}

Une fois ajouté, vous pouvez simplement passer le nom de votre processus:

[jaypal:~] sleep 100&
[1] 77212
[jaypal:~] killp sleep
[1]+  Terminated: 15          sleep 100
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.