web-dev-qa-db-fra.com

Comment mettre fin à un processus d'arrière-plan?

J'ai démarré un wget sur une machine distante en arrière-plan en utilisant &. Soudain, il cesse de télécharger. Je souhaite terminer son processus, puis réexécuter la commande. Comment puis-je y mettre fin?

Je n'ai pas fermé sa fenêtre Shell. Mais comme vous le savez, cela n'arrête pas d'utiliser Ctrl+C et Ctrl+Z.

213
Mohammad Etemaddar

Il y a plusieurs façons de procéder.

Méthode n ° 1 - ps

Vous pouvez utiliser la commande ps pour trouver l'ID de processus pour ce processus, puis utiliser le PID pour tuer le processus.

Exemple

$ ps -eaf | grep [w]get 
saml      1713  1709  0 Dec10 pts/0    00:00:00 wget ...

$ kill 1713

Méthode n ° 2 - pgrep

Vous pouvez également trouver l'ID de processus à l'aide de pgrep.

Exemple

$ pgrep wget
1234

$ kill 1234

Méthode n ° 3 - pkill

Si vous êtes sûr que c'est le seul wget que vous avez exécuté, vous pouvez utiliser la commande pkill pour tuer le travail par son nom.

Exemple

$ pkill wget

Méthode n ° 4 - emplois

Si vous êtes dans le même shell à partir duquel vous avez exécuté le travail qui est maintenant en arrière-plan. Vous pouvez vérifier s'il fonctionne toujours en utilisant la commande jobs, et également le tuer par son numéro de travail.

Exemple

Mon faux travail, sleep.

$ sleep 100 &
[1] 4542

Trouvez son numéro de travail. REMARQUE: le nombre 4542 est l'ID du processus.

$ jobs
[1]+  Running                 sleep 100 &

$ kill %1
[1]+  Terminated              sleep 100

Méthode n ° 5 - fg

Vous pouvez ramener un travail en arrière-plan au premier plan à l'aide de la commande fg.

Exemple

Fake job, sleep.

$ sleep 100 &
[1] 4650

Obtenez le numéro du travail.

$ jobs
[1]+  Running                 sleep 100 &

Ramenez le travail n ° 1 au premier plan, puis utilisez Ctrl+C.

$ fg 1
sleep 100
^C
$
274
slm

En bash, vous pouvez utiliser fg pour placer le travail au premier plan, puis utiliser Ctrl+C

Ou listez le processus en arrière-plan avec jobs puis faites

kill %1

(avec 1 remplacé par le nombre jobs vous a donné)

77
Zelda

Vous pouvez également utiliser kill $! pour supprimer le dernier travail en arrière-plan.

14
tek0078

EDIT: Une fois au premier plan, vous pouvez Ctrl+C, ou comme le mentionne @Zelda, tuez avec le '% x' où 'x' est le numéro de tâche enverra le signal par défaut (très probablement SIGTERM dans le cas de Linux).

tapez simplement fg pour le mettre au premier plan, s'il s'agit du dernier processus que vous avez mis en arrière-plan (avec '&').

S'il ne s'agit pas du dernier, tapez: jobs et recherchez le 'numéro de travail', représenté dans '[]'. Tapez ensuite:

fg 2

.. où "2" est le numéro de la tâche, par exemple:

foo@bar:~/junk/books$ jobs
[1]+  Running                 okular how_to_cook_a_turkey.pdf &
foo@bar:~/junk/books$ fg 1
okular how_to_cook_a_turkey.pdf            <- this is now in the foreground.
6
swisscheese

La bonne façon est de taper jobs puis d'utiliser le numéro de travail pour le tuer. Afin d'utiliser le pid pour le tuer, vous devez le mettre au premier plan comme indiqué dans la première réponse.

Essaye ça

~/Desktop$ sleep 1000 &
[1] 7056

~/Desktop$ jobs

[1]+  Running  sleep 1000 &

/Desktop$ kill %1  #(%1 is the job number)

Si vous exécutez des travaux juste après l'avoir tué, vous devriez voir ceci

Desktop$ jobs
[1]+  Terminated              sleep 1000
4
tmac

Une chose que je ne vois pas ici, que j'ai trouvée très utile en particulier lors du test de commandes, est pidof. Vous pouvez utiliser pidof [command] pour trouver l'ID de processus d'un processus en cours d'exécution. Je l'aime parce que cela me permet de trouver rapidement l'id de la commande que je veux, ce qui est généralement quelque chose que je viens d'invoquer.

Une fois que vous avez le pid, vous pouvez simplement tuer le processus. Il permet de créer des scripts simples pour tuer un processus uniquement s'il est en cours d'exécution.

4
Try431

Un exemple courant est l'outil stress. Disons que vous avez exécuté ce qui suit:

$ stress -c 4 -m 4 

et fermé la fenêtre du terminal. Le processus continuerait de consommer vos ressources de l'arrière-plan.

C'est ce que je fais:

$ x=`pgrep stress` ; Sudo kill -9 $x 

pgrep répertorie les PID du processus soumis et les stocke dans la variable x qui est ensuite utilisée par kill -9 pour y mettre fin.

1
Saptarshi Ghosh

Le moyen le plus simple consiste à utiliser -9 drapeau sur kill commande

user@Host:/path> jobs
[1]+  Running                 /usr/home/script1.sh $i &
user@Host:/path> fg
/usr/home/script1.sh $i
^C
[1]+  Stopped                 /usr/home/script1.sh $i
user@Host:/path> kill -9 %1
[1]+  Stopped                 /usr/home/script1.sh $i
user@Host:/path>
[1]+  Killed                  /usr/home/script1.sh $i
user@Host:/path>
user@Host:/path> jobs
user@Host:/path>
0
handba

dans bash dernier processus arrêté (Ctrl-Z) vous tuerez par:

kill %%
kill -9 %%

ou si vous voulez choisir, utilisez:

jobs

puis:

kill %N

comme kill %2

0
Sławomir Lenart