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

196

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

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

Mohammad Etemaddar
la source

Réponses:

256

Il y a plusieurs façons de s'y prendre.

Méthode n ° 1 - ps

Vous pouvez utiliser la pscommande pour rechercher 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 certain que c'est le seul que wgetvous avez exécuté, vous pouvez utiliser la commande pkillpour supprimer 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 actuellement en arrière-plan. Vous pouvez vérifier s'il est toujours en cours à l'aide de la jobscommande et également le tuer par son numéro de travail.

Exemple

Mon faux travail, sleep.

$ sleep 100 &
[1] 4542

Trouvez son numéro d'emploi. REMARQUE: le numéro 4542 correspond à l'ID de 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 fgcommande.

Exemple

Faux travail, 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
$
slm
la source
Le jobsn'a pas outputet fg sais: -bash: fg: 1: no such job. Mais taper fgfonctionne bien et pkill wgetfonctionne bien aussi. mais ps -eaf|grep wgetet puis la kill <process number>dose n'arrête pas le travail. ps: J'utilise le troisième numéro comme numéro de processus .
Mohammad Etemaddar
1
@MohammadEtemaddar - utilise le deuxième numéro de la sortie de ps. Le 3ème # est l'identifiant du processus du parent.
slm
1
@MohammadEtemaddar - ah, le ps est en train de trouver le grep. Faites - le comme ceci: ps -eaef| grep [w]get.
slm
1
@MohammadEtemaddar - vous pouvez également utiliser à la pgrepplace, pgrep wget.
slm
2
@MohammadEtemaddar - désolé, le supplément e est une faute de frappe. Devrait lire ps -eaf | grep [w]get. Les options sont dans la pspage de manuel. man ps.
slm
70

En bash, vous pouvez utiliser fgpour faire passer le travail au premier plan, puis utilisez Ctrl+C

Ou lister le processus en arrière-plan avec jobset ensuite faire

kill %1

(avec 1 remplacé par le numéro jobsqui vous a été donné)

Zelda
la source
13

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

tek0078
la source
S'il est utilisé comme une commande comme un alias dans un profil bash, veillez à mettre entre guillemets.
Nate Ritter le
6

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

il suffit de taper fgpour le mettre au premier plan, si c'est le dernier processus que vous avez mis en arrière-plan (avec '&').

Si ce n'était pas le dernier, tapez: jobset trouvez le 'numéro de travail', représenté dans '[]'. Puis tapez simplement:

fg 2

..where '2' est le numéro de travail, 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.
fromage suisse
la source
4

La méthode correcte consiste à taper jobspuis à utiliser le numéro de travail pour le tuer. Pour 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
tmac
la source
4

Une chose que je ne vois pas ici, et que je trouve très utile, en particulier lors du test des commandes, est pidof. Vous pouvez utiliser pidof [command]pour trouver l'ID de processus d'un processus en cours d'exécution. J'aime ça 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'appeler.

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.

Try431
la source
1
Ah ça m'a aidé! kill% 1 ne fonctionnait pas pour une raison quelconque: "kill: échec de l'analyse des arguments: '% 1'" et Ctrl + C ne fonctionnait pas.
Impossible de
1

Un exemple courant est l' stressoutil. Disons que vous avez couru ce qui suit:

$ stress -c 4 -m 4 

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

C'est ce que je fais:

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

pgreprépertorie les PID du processus soumis et les stocke dans une variable xqui l'a ensuite utilisée kill -9pour le terminer.

Saptarshi Ghosh
la source
0

lors du dernier processus arrêté de bash (Ctrl-Z) vous allez tuer par:

kill %%
kill -9 %%

ou si vous voulez choisir, utilisez:

jobs

ensuite:

kill %N

comme kill %2

Sławomir Lenart
la source