2010-05-05 4 views
39

Comment puis-je tuer un processus qui est en cours d'exécution en bash - par exemple, supposons que j'ouvrir un fichier:tuer un processus bash

$ gedit file.txt

est-il possible dans l'invite de commande pour le fermer? Cet exemple est assez trivial, car je pourrais juste fermer la fenêtre, mais il semble y avoir un peu de recul, en particulier lorsque je fais des erreurs de frappe.

Existe-t-il un moyen d'échapper un exécutable en cours d'exécution? Cela a probablement la même solution, mais je pensais que je demanderais de toute façon.

Merci

+0

Cela ressemble plus à une question d'utilisation shell qu'une question de programmation shell - les meilleures pratiques sont différentes entre les scripts et l'utilisation interactive, et ce dernier appartient sur superuser ra ther que SO. –

+0

Je ne vois pas comment cela devrait être un doublon de la question liée. Cette question demande de supprimer le processus qui s'exécute dans le terminal actuel. La question "en double" pose la question de trouver un identifiant de processus de processus arbitraire pour tuer. – luator

Répondre

33

Pour interrompre, vous pouvez appuyer sur ctrl c envoyer un SIGINT. Si cela ne l'arrête pas, vous pouvez essayer de le tuer en utilisant kill -9 <pid>, qui envoie un SIGKILL. Ce dernier ne peut pas être ignoré/intercepté par le processus lui-même (celui qui est tué).

Pour déplacer le processus actif à fond, vous pouvez appuyer sur ctrl z.Le processus est envoyé en arrière-plan et vous revenez à l'invite du shell. Utilisez la commande fg pour faire le contraire.

+6

Je suis surpris que personne n'a encore mentionné Ctrl-Z ou Ctrl-C. Ctrl-C demande durement au programme en cours de quitter. Ctrl-Z devrait toujours fonctionner sur un programme, mais certains programmes surchargent Ctrl-C avec un gestionnaire de signal, et le gestionnaire de signal peut ne pas toujours fermer le programme. –

+3

Après avoir mis en pause le processus avec ctrlz, vous pouvez le tuer avec 'kill -9%'. – luator

+0

Encore une chose à ajouter: si le processus ne réagit pas à Ctrl + C (qui envoie SIGINT), vous pouvez être un peu plus brutal et utiliser Ctrl + \ pour envoyer un SIGQUIT. – luator

64

Vous avez plusieurs options: un

D'abord, vous pouvez utiliser kill. Mais vous avez besoin du pid de votre processus, que vous pouvez obtenir en utilisant ps, pidof ou pgrep.

ps -A // to get the pid, can be combined with grep 
-or- 
pidof <name> 
-or- 
pgrep <name> 

kill <pid> 

Il est possible de tuer un processus en connaissant simplement le nom. Utilisez pkill ou killall.

pkill <name> 
-or- 
killall <name> 

Toutes les commandes envoient un signal au processus. Si le processus a raccroché, il pourrait être neccessary d'envoyer un sigkill au processus (ce qui est le numéro de signal 9, de sorte que les exemples qui suivent font la même chose):

pkill -9 <name> 
pkill -SIGKILL <name> 

Vous pouvez utiliser cette option avec kill et killall, aussi.

Lisez cet article à propos de controlling processes pour obtenir plus d'informations sur les processus en général.

+2

Une autre option est 'killall -9 ', ou kill -9 '' pidof '' – jweyrich

+0

@jweyrich: Merci - J'ai édité ma réponse pour refléter cela. – tanascius

+2

Soyez prudent avec 'killall'. Sur Solaris, 'killall' va tuer tous les processus actifs. Je recommanderais d'utiliser '' kill'' ou '' pkill''. –

1

Vous pouvez utiliser la commande pkill pour arrêter les processus. Si vous voulez "jouer", vous pouvez utiliser "pgrep", qui fonctionne exactement de la même manière mais retourne le processus plutôt que de le tuer. Pkill a le paramètre -f qui vous permet de faire correspondre à la commande entière. Donc, pour votre exemple, vous pouvez: pkill de « gedit de file.txt »

8

essayer kill -9 {processID}

Pour trouver l'ID de processus, vous pouvez utiliser ps -ef | grep gedit

+6

Que -9 soit un peu dur sur un processus normal, il est préférable de ne l'utiliser que sur quelque chose qui ne réagit pas à une demande de destruction 'normale'. –

+1

envisage également d'utiliser pgrep plutôt que grepping ps - en particulier lors de l'écriture des scripts –

0

Il est clair pour moi ce que vous entendez par "échapper un exécutable qui est en cours d'exécution", mais ctrl-z va mettre un processus en arrière-plan et retourner le contrôle à la ligne de commande. Vous pouvez ensuite utiliser la commande fg pour ramener le programme au premier plan.

4

Ancien poste, mais je viens de rencontrer un problème très similaire. Après quelques expériences, je trouve que vous pouvez le faire avec une seule commande:

kill $(ps aux | grep <process_name> | grep -v "grep" | cut -d " " -f2) 

Dans le cas de l'OP, <process_name> serait "gedit file.txt".

+2

Ne fonctionne pas bien que cela semble bon. Mais cela fonctionne: ps -ef | grep yourproc | awk '{print $ 2}' | xargs kill – Timo

+1

Le séparateur n'est pas bon. Vous devriez l'ajuster avant. cela devrait fonctionner: kill -9 $ (ps aux | grep "worker-manager-rsync" | grep -v "grep" | tr -s "" | couper -d "" -f 2) – ikken

+0

fonctionne! je ne change que le dernier chiffre kill $ (ps aux | grep | grep -v "grep" | cut -d "" -f3) –

0

S'il vous plaît vérifier la commande « top » alors si votre script ou tout sont en cours d'exécution s'il vous plaît noter « PID »

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
1384 root  20 0 514m 32m 2188 S 0.3 5.4 55:09.88 example 
14490 root  20 0 15140 1216 920 R 0.3 0.2 0:00.02 example2 



kill <you process ID> 

Example : kill 1384 
4

Celui-ci est l'utilisation violente avec précaution:

pkill -9 -e -f processname 

Si votre nom de processus est "sh" il va également tuer "bash"