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.
Il y a plusieurs façons de procéder.
Vous pouvez utiliser la commande ps
pour trouver l'ID de processus pour ce processus, puis utiliser le PID pour tuer le processus.
$ ps -eaf | grep [w]get
saml 1713 1709 0 Dec10 pts/0 00:00:00 wget ...
$ kill 1713
Vous pouvez également trouver l'ID de processus à l'aide de pgrep
.
$ pgrep wget
1234
$ kill 1234
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.
$ pkill wget
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.
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
Vous pouvez ramener un travail en arrière-plan au premier plan à l'aide de la commande fg
.
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
$
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é)
Vous pouvez également utiliser kill $!
pour supprimer le dernier travail en arrière-plan.
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.
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
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.
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.
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>
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