J'ai eu le problème opposé maintenant, il ne serait pas avertir des emplois arrêtés lorsque je quitte le shell! J'ai dû mettre shopt -s checkjobsdans mon .bashrc
Sam Watkins
1
Appuyez à nouveau sur Ctrl + D, il vous permettra de sortir maintenant, éliminant ainsi ces emplois
Jens Timmerman
Réponses:
73
Pour supprimer rapidement tous les travaux arrêtés sous la bash, entrez:
kill -9 `jobs -ps`
jobs -psrépertorie les ID de processus ( -p) des travaux arrêtés ( -s). kill -9 `jobs -ps`envoie des signaux SIGKILL à tous.
n'a pas fonctionné lorsque le travail était "sudo su". c'est-à-dire que cela sudo kill `jobs -p`n'a pas fonctionné, mais que vous avez explicitement saisi PID.
user13107
14
Pourquoi est-ce si bien voté? C'est faux. Si les processus sont arrêtés, un processus killcomme celui-ci ne fera rien, puisque les processus sont arrêtés, ils ne traiteront pas le SIGTERM (-15) qui leur est envoyé par défaut.
Cela devrait le faire, mais je pense qu'il devrait d'abord envoyer un SIGTERM (-15) avant d'envoyer un SIGKILL (-9). Donc, peut-être que proposer quelque chose comme "tuer $ (emplois -p); dormir 3s; tuer -9 $ (emplois -p)" serait mieux. En envoyant d'abord SIGTERM, les travaux peuvent être en mesure d'effectuer une sortie propre (libération des ressources allouées, etc.).
Rems
3
Kevin Duke, votre réponse est celle qui a fonctionné pour moi. Je n'ai pas pu voter parce que je n'ai pas 15 ans de réputation. kill -9 $ (jobs -p)
2
@rems Sauf, comme l'a souligné slm, ils ne recevront pas le SIGTERM car ils sont arrêtés.
La réponse acceptée tuerait tous les emplois (ce qui est suffisant dans ce cas) et pas simplement les emplois arrêtés. Si vous ne voulez tuer que ceux qui sont arrêtés, lancez:
grep / cut peut être combiné en une commande awk: awk '/Stopped/{print $3}')
laebshade
2
l' -sargument de la réponse acceptée ne filtre que les réponses arrêtées
79E09796
12
Le moyen le plus simple est en réalité de simplement réessayer immédiatement la sortie; bashcela signifiera "tuer tous les travaux arrêtés et quitter".
vous pouvez ajouter une mise en forme de code pour cette ligne afin de la rendre plus lisible.
drcelus
Pouvez-vous revoir votre formatage - utilisez quatre espaces au début de la ligne pour marquer un bloc en tant que code (plutôt que d'utiliser backtick). À l'heure actuelle, il n'est pas clair si vous utilisez des backticks dans votre code ou essayez d'afficher le code à l'aide de backticks.
dimanche
Le formatage est bon. nous devons passer les travaux -p en utilisant des backticks, sinon cela ne sera pas considéré comme une commande, et une erreur sera renvoyée.
lundi
5
Juste au cas où cela aiderait quelqu'un d'autre - la plupart des gens sont ici parce qu'ils ont démarré des processus arrêtés, éventuellement via le shell. Je devais trouver des processus, en tant que root, arrêtés par d'autres utilisateurs, pour lesquels les variantes de la jobscommande ne fonctionneraient pas.
Un peu de fouilles avec man psmoi m'a amené à ceci:
ps -a -o pid,user,cmd,state | grep 'T$'
Explication: le -adrapeau indique afficher tous les processus, puis -ocontrôle la sortie, quelles informations seront affichées pour chaque processus. Je choisis pid, user, cmd(la ligne de commande), et statequi est l' état du processus .
De man ps:
PROCESS STATE CODES
Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the
state of a process:
D uninterruptible sleep (usually IO)
R running or runnable (on run queue)
S interruptible sleep (waiting for an event to complete)
T stopped, either by a job control signal or because it is being traced
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped by its parent
donc finalement je le passe à grep T$qui dit, montre moi tous les processus qui ont T dans la dernière colonne.
Et puis j'ai une belle liste de tous les processus de différents utilisateurs qui sont à l'état arrêté.
$ ps -a -o pid,user,cmd,state | grep 'T$'
865 joson74+ python T
885 joson74+ sh -c less T
886 joson74+ less T
1014 minames+ python3.4 -i /home/minames T
5352 MooKo nano stdio.h T
7851 harry tmux attach T
12083 harry tmux attach T
13495 gorylla+ python3.4 -i /home/gorylla1 T
18009 conr1d vim T
19664 enythin+ python T
24906 wardlist python T
Pour obtenir des travaux arrêtés attachés au shell actuel, jobs -psc'est plus simple que cette réponse. Cela étant dit, cette réponse ne montre pas que les travaux arrêtés via Ctrl-Zun shell, mais tous les travaux arrêtés: autres shells, autres utilisateurs , y compris les travaux en cours de débogage (par exemple, par gdb).
Stéphane Gourichon
Pour moi, la meilleure réponse, mais ne fonctionne pas exactement. Je devais utiliser ps -el | grep Tpour trouver les processus dans l'état 'T'.
dr0i
4
Si vous souhaitez supprimer certains travaux arrêtés mais pas tous, essayez ceci:
Tout d’abord, listez les emplois, vous obtiendrez quelque chose comme ceci:
Normalement, si vous recevez ce message, vous devez vous déconnecter deux fois. Par exemple, Ctrl+Dvous recevez d’abord le message d’avertissement vous informant des tâches arrêtées. Une deuxième pression sur cette touche vous permettra de vous déconnecter, éliminant ainsi les tâches. Ceci s'applique également aux commandes logoutet exit.
Pour les tuer manuellement, essayez: kill $(jobs -p).
Si vous ne voulez pas supprimer les travaux de votre shell actuel, vous pouvez les supprimer du tableau des travaux actifs sans détruire à l'aide de la disowncommande. Par exemple
Les tâches Tarrêtées peuvent également être déterminées par l'état du processus ( caractère), ce qui signifie que le processus a été arrêté par un signal tel que SIGSTOP, SIGTSTPou autre (comme SIGTTIN, ou SIGTTOU).
Dans le cas où jobsune commande shell est builtin pas disponible, arrêté les processus peuvent être répertoriés par la commande suivante:
ps wuax | awk '$8 ~ "T"'
Pour tous les tuer, vous pouvez essentiellement taper:
shopt -s checkjobs
dans mon .bashrcRéponses:
Pour supprimer rapidement tous les travaux arrêtés sous la bash, entrez:
jobs -ps
répertorie les ID de processus (-p
) des travaux arrêtés (-s
).kill -9 `jobs -ps`
envoie des signaux SIGKILL à tous.la source
sudo kill `jobs -p`
n'a pas fonctionné, mais que vous avez explicitement saisi PID.kill
comme celui-ci ne fera rien, puisque les processus sont arrêtés, ils ne traiteront pas le SIGTERM (-15) qui leur est envoyé par défaut.Essayez de taper ceci:
la source
La réponse acceptée tuerait tous les emplois (ce qui est suffisant dans ce cas) et pas simplement les emplois arrêtés. Si vous ne voulez tuer que ceux qui sont arrêtés, lancez:
la source
awk '/Stopped/{print $3}')
-s
argument de la réponse acceptée ne filtre que les réponses arrêtéesLe moyen le plus simple est en réalité de simplement réessayer immédiatement la sortie;
bash
cela signifiera "tuer tous les travaux arrêtés et quitter".la source
la source
Juste au cas où cela aiderait quelqu'un d'autre - la plupart des gens sont ici parce qu'ils ont démarré des processus arrêtés, éventuellement via le shell. Je devais trouver des processus, en tant que root, arrêtés par d'autres utilisateurs, pour lesquels les variantes de la
jobs
commande ne fonctionneraient pas.Un peu de fouilles avec
man ps
moi m'a amené à ceci:Explication: le
-a
drapeau indique afficher tous les processus, puis-o
contrôle la sortie, quelles informations seront affichées pour chaque processus. Je choisispid
,user
,cmd
(la ligne de commande), etstate
qui est l' état du processus .De
man ps
:donc finalement je le passe à
grep T$
qui dit, montre moi tous les processus qui ont T dans la dernière colonne.Et puis j'ai une belle liste de tous les processus de différents utilisateurs qui sont à l'état arrêté.
la source
jobs -ps
c'est plus simple que cette réponse. Cela étant dit, cette réponse ne montre pas que les travaux arrêtés viaCtrl-Z
un shell, mais tous les travaux arrêtés: autres shells, autres utilisateurs , y compris les travaux en cours de débogage (par exemple, par gdb).ps -el | grep T
pour trouver les processus dans l'état 'T'.Si vous souhaitez supprimer certains travaux arrêtés mais pas tous, essayez ceci:
Tout d’abord, listez les emplois, vous obtiendrez quelque chose comme ceci:
envoyer kill à un travail arrêté, il ne fera que mettre en file d'attente que de le placer au premier plan, il se terminera
la source
Normalement, si vous recevez ce message, vous devez vous déconnecter deux fois. Par exemple, Ctrl+Dvous recevez d’abord le message d’avertissement vous informant des tâches arrêtées. Une deuxième pression sur cette touche vous permettra de vous déconnecter, éliminant ainsi les tâches. Ceci s'applique également aux commandes
logout
etexit
.Pour les tuer manuellement, essayez:
kill $(jobs -p)
.Si vous ne voulez pas supprimer les travaux de votre shell actuel, vous pouvez les supprimer du tableau des travaux actifs sans détruire à l'aide de la
disown
commande. Par exempleLes tâches
T
arrêtées peuvent également être déterminées par l'état du processus ( caractère), ce qui signifie que le processus a été arrêté par un signal tel queSIGSTOP
,SIGTSTP
ou autre (commeSIGTTIN
, ouSIGTTOU
).Dans le cas où
jobs
une commande shell est builtin pas disponible, arrêté les processus peuvent être répertoriés par la commande suivante:Pour tous les tuer, vous pouvez essentiellement taper:
Voici un test simple:
la source