Vraag Hoe kan ik alle gestopte taken doden?


Wanneer ik probeer mijn Linux-server te verlaten, krijg ik de melding:

Er zijn gestopt banen.

: Is er één commando om deze te doden?


80
2018-02-25 10:07


oorsprong


Extra voorbeelden in de U & L Q & A: unix.stackexchange.com/questions/124428/... - slm
Ik had nu een tegengesteld probleem, het zou niet waarschuwen voor gestopt banen toen ik de shell verliet! Moest zetten shopt -s checkjobs in mijn .bashrc - Sam Watkins
druk nogmaals op ctrl + d, het laat je nu afsluiten en vernietigt die taken in het proces - Jens Timmerman


antwoorden:


Om snel alle banen die onder de bash draaien te doden, voer je in:

kill `jobs -ps`

jobs -ps lijst proces-ID van de gestopte taken. kill `jobs -ps` stuur een TERM-signaal naar alle gestopte taken.


69
2018-02-25 10:15



-1 voor "kill Jobs" - Tibor
werkte niet toen de taak "sudo su" was. d.w.z. sudo kill `jobs -p` werkte niet maar typte expliciet in met PID. - user13107
Waarom is dit zo goed? Het is verkeerd. Als de processen zijn gestopt, dan is kill zoals dit zal niets doen, omdat de processen worden gestopt, zullen ze de SIGTERM (-15) die standaard naar hen is verzonden niet verwerken. - slm
kill -9 zal het lukken. - Blossoming_Flower
Duidelijk fout antwoord! - mrangry777


Probeer dit te typen:

kill -9 $(jobs -p)

76
2018-02-25 10:14



Dat zou het moeten doen, maar ik denk dat hij eerst een SIGTERM (-15) moet sturen voordat hij een SIGKILL (-9) verzendt. Dus misschien stelt iets voor als "kill $ (jobs -p); slaap 3s; kill -9 $ (jobs -p)" zou beter zijn. Door SIGTERM eerst te verzenden, kunnen de taken een schone exit uitvoeren (vrijmaken van toegewezen bronnen, enz.). - rems
Kevin Duke, jouw antwoord is degene die voor me werkte. Ik kon niet stemmen omdat ik geen reputatie heb. kill -9 $ (jobs -p)
@rems behalve, zoals slm opmerkte, krijgen ze de SIGTERM niet omdat ze zijn gestopt. - Paul Gear
Werkt niet op zsh. Door zsh niet zijnde POS  IX voldoet aan de eisen. - Max Coplan


Het geaccepteerde antwoord zou alle banen doden (wat in dit geval voldoende is) en niet alleen de gestopte. Als je alleen de gestopte wilt doden, voer dan:

kill $(jobs -l | grep Stopped | cut -d' ' -f3)

16
2018-03-08 18:04



grep / cut kan in één awk-opdracht worden gecombineerd: awk '/Stopped/{print $3}') - laebshade
de -s argument op het geaccepteerde antwoord filtert alleen de gestopte - 79E09796


De eenvoudigste manier is om gewoon de uitgang onmiddellijk opnieuw te proberen; bash zal dit betekenen in de betekenis van "alle stopgezette taken doden en afsluiten".


12
2018-03-08 18:13



Dat zal een HUP sturen die niet noodzakelijkerwijs een baan stopt. - Stephen Niedzielski


for x in `jobs -p` ; do kill -9 $x ; done

7
2018-02-26 10:22



u kunt code-opmaak voor deze regel toevoegen om het lezen te vergemakkelijken. - drcelus
Kun je opnieuw naar je opmaak kijken - gebruik vier spaties aan het begin van de regel om een ​​blok als code te markeren (in plaats van backtick te gebruiken). Op dit moment is het niet duidelijk of je backticks gebruikt in je code, of probeert om code weer te geven met behulp van backticks. - dunxd
De opmaak is prima. we moeten de taken doorgeven -p met behulp van backticks anders zal het niet beschouwen als een commando, en het zal een fout veroorzaken. - monu


Als u enkele stopgezette taken maar niet alle wilt verwijderen, probeert u dit:

Eerst, maak een lijst van banen, je krijgt zoiets als dit:

$ jobs -l

[2]   4813 Stopped                 ./parse < call.txt
[3]-  4819 Stopped                 ./parse < call.txt

stuur moord naar een gestopt werk, het doet niets anders dan wachtrij dan breng het op de voorgrond, het zal eindigen

$ fg %2
./parse < call.txt
Terminated

$ jobs -l
[3]-  4819 Stopped                 ./parse < call.txt

4
2018-05-30 04:16





Normaal gesproken, als u dat bericht hebt, moet u tweemaal uitloggen. Bijv. eerste Ctrl + D geeft u het waarschuwingsbericht om u te informeren over stopgezette taken. Als u voor de tweede keer op drukt, wordt u uitgelogd en worden de taken gedood. Dit geldt ook voor logout en exit commando's.

Om ze handmatig te doden, probeer je: kill $(jobs -p).


Als u geen taken uit uw huidige shell wilt verwijderen, kunt u deze uit de tabel met actieve taken verwijderen zonder te doden door te gebruiken disown commando. Bijv.

$ sleep 1000 &
[1] 19404
$ jobs
[1]+  Running                 sleep 1000 &
$ disown

Gestopte taken kunnen ook worden bepaald door de status van het proces (T karakter) wat betekent dat het proces werd gestopt door een signaal zoals SIGSTOP, SIGTSTP of andere (zoals SIGTTINof SIGTTOU).

In het geval wanneer jobs een opdracht shell builtin is niet beschikbaar, gestopt processen kunnen worden weergegeven met de volgende opdracht:

ps wuax | awk '$8 ~ "T"'

Om ze allemaal te doden, kun je in principe typen:

kill -9 $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}')

Hier is een eenvoudige test:

$ sleep 1000 &
[1] 2014
$ sleep 1000 &
[2] 2015
$ sleep 1000 &
[3] 2016
$ sleep 1000 &
[4] 2017
$ killall -STOP sleep
[1]   Stopped                 sleep 1000
[2]   Stopped                 sleep 1000
[3]   Stopped                 sleep 1000
[4]   Stopped                 sleep 1000
$ ps wuax | awk '$8 ~ "T"'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
vagrant   2014  0.0  0.0   7228   832 pts/0    T    20:38   0:00 sleep 1000
vagrant   2015  0.0  0.0   7228   708 pts/0    T    20:38   0:00 sleep 1000
vagrant   2016  0.0  0.0   7228   760 pts/0    T    20:38   0:00 sleep 1000
vagrant   2017  0.0  0.0   7228   828 pts/0    T    20:38   0:00 sleep 1000
$ kill -9 $(awk 'NR>1 && $8 ~ "T" {print $2}' <(ps wuax))
$ jobs
[1]   Killed                  sleep 1000
[2]   Killed                  sleep 1000
[3]   Killed                  sleep 1000
[4]   Killed                  sleep 1000

4
2018-02-19 20:46





Voor het geval dit iemand anders helpt - de meeste mensen zijn hier omdat ze een aantal stopgezette processen hebben waarmee ze begonnen zijn, misschien via de shell. Ik moest processen vinden, als root, gestopt door andere gebruikers, voor welke varianten op de jobs commando zal niet doen.

Een beetje graven met man ps heb me hiertoe gebracht:

ps -a -o pid,user,cmd,state | grep 'T$'

Uitleg: de -a flag zegt dan alle processen laten zien -o regelt de uitvoer, welke informatie over elk proces wordt getoond. Ik kies pid, user, cmd (de opdrachtregel), en state, welke is de processtaat.

Van 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

dus uiteindelijk pijp ik het grep T$ welke zegt, toon me alle processen die T hebben in de laatste kolom.

En dan heb ik een mooie lijst van alle processen van verschillende gebruikers die zich in de stopstaat bevinden.

$ 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

4
2018-02-26 06:47



Om gestopt banen vast te houden aan de huidige shell, jobs -ps is eenvoudiger dan dit antwoord. Dat gezegd hebbende, toont dit antwoord niet alleen banen gestopt via Ctrl-Z in een schaal, maar alle stopgezette taken: andere shells, andere gebruikers, inclusief taken die worden debugged (bijvoorbeeld door gdb). - Stéphane Gourichon