Jak mogę zabić wszystkie zatrzymane zlecenia?

91

Gdy próbuję wyjść z mojego serwera Linux, pojawia się komunikat:

Są zatrzymane prace.

: Czy istnieje jedno polecenie, aby je zabić?

Zubair
źródło
Dodatkowe przykłady w pytaniach
slm
Miałem teraz odwrotny problem, nie ostrzegałbym o zatrzymanych zadaniach, gdy opuszczam powłokę! Musiałem włożyć shopt -s checkjobsmój .bashrc
Sam Watkins
1
naciśnij ctrl + d ponownie, pozwoli ci to wyjść teraz, zabijając te zadania w tym procesie
Jens Timmerman

Odpowiedzi:

73

Aby szybko zabić wszystkie zatrzymane zadania w ramach bash, wpisz:

kill -9 `jobs -ps`

jobs -pswyświetla identyfikatory procesów ( -p) zatrzymanych ( -s) zadań.
kill -9 `jobs -ps`wysyła do wszystkich sygnały SIGKILL.

ooshro
źródło
22
-1 dla „zabić Jobsa”
1
nie działało, gdy praca brzmiała „sudo su”. tzn. sudo kill `jobs -p`nie działało, ale wyraźnie wpisało się PID.
user13107,
14
Dlaczego jest to tak wysoko oceniane? To jest źle. Jeśli procesy zostaną zatrzymane, killtakie jak to nic nie zrobi, ponieważ procesy są zatrzymane, nie będą przetwarzać SIGTERM (-15), który jest do nich domyślnie wysyłany.
slm
6
kill -9 załatwi sprawę.
timofly
84

Spróbuj wpisać to:

kill -9 $(jobs -p)
dukevin
źródło
9
To powinno wystarczyć, ale myślę, że powinien on najpierw wysłać SIGTERM (-15) przed wysłaniem SIGKILL (-9). Być może lepiej byłoby zaproponować coś takiego: „kill $ (jobs -p); sleep 3s; kill -9 $ (jobs -p)”. Najpierw wysyłając SIGTERM, zadania mogą wykonać czyste wyjście (zwolnienie przydzielonych zasobów itp.).
rem
3
Kevin Duke, twoja odpowiedź była dla mnie odpowiednia. Nie mogłem głosować, ponieważ nie mam 15 reputacji. zabij -9 $ (zadania -p)
2
@rems Tyle że, jak wskazał slm, nie dostaną SIGTERM, ponieważ są zatrzymani.
Paul Gear
1
Nie działa na Zsh. Z powodu niezgodności zsh z POS IX z zadaniami .
Max Coplan
Jak więc poradzić sobie z Zsh?
fx-kirin
16

Przyjęta odpowiedź zabiłaby wszystkie zadania (co w tym przypadku jest wystarczające), a nie tylko te zatrzymane. Jeśli chcesz zabić tylko tych Zatrzymanych, uruchom:

kill $(jobs -l | grep Stopped | cut -d' ' -f3)
Kit Sunde
źródło
grep / cut można połączyć w jedno polecenie awk: awk '/Stopped/{print $3}')
laebshade
2
-sargumentem na przyjętych filtrów odpowiedział, tylko zatrzymany jedynek
79E09796
12

Najłatwiej jest po prostu natychmiast spróbować ponownie wyjść; bashoznacza to „zabij wszystkie zatrzymane zadania i wyjdź”.

geekozaur
źródło
4
To wyśle ​​HUP, który niekoniecznie zatrzymuje jakiekolwiek zadania.
Stephen Niedzielski
7
for x in `jobs -p` ; do kill -9 $x ; done
monu
źródło
2
możesz dodać formatowanie kodu dla tego wiersza, aby ułatwić czytanie.
drcelus
Czy możesz jeszcze raz spojrzeć na swoje formatowanie - użyj czterech spacji na początku wiersza, aby zaznaczyć blok jako kod (zamiast używać odwrotnego kursora). W tej chwili nie jest jasne, czy używasz kodu wstecznego, czy próbujesz wyświetlić kod za pomocą znaków wstecznych.
dunxd
Formatowanie jest w porządku. musimy przekazać zadania -p za pomocą odwrotnych poleceń, w przeciwnym razie nie będzie to uważane za polecenie i spowoduje zgłoszenie błędu.
pon.
5

Na wypadek, gdyby to pomogło komuś innemu - większość ludzi jest tutaj, ponieważ mają zatrzymane procesy, które uruchomili, być może w tle za pośrednictwem powłoki. Musiałem znaleźć procesy, jako root, zatrzymane przez innych użytkowników, dla których warianty jobspolecenia nie będą działać.

Trochę grzebania w tym man psdoprowadziło mnie do tego:

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

Objaśnienie: -aflaga mówi: pokaż wszystkie procesy, a następnie -okontroluje dane wyjściowe, jakie informacje będą wyświetlane o każdym procesie. Mam wyboru pid, user, cmd(wiersz poleceń) i state, co jest stan procesu .

Od 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

więc w końcu przesyłam do niego, grep T$co mówi: pokaż mi wszystkie procesy, które mają T w ostatniej kolumnie.

A potem mam ładną listę wszystkich procesów od różnych użytkowników, którzy są w stanie zatrzymania.

$ 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
hwjp
źródło
Aby zatrzymać zadania dołączone do bieżącej powłoki, jobs -psjest prostsze niż ta odpowiedź. To powiedziawszy, ta odpowiedź nie pokazuje tylko zadań zatrzymanych za pośrednictwem Ctrl-Zpowłoki, ale wszystkich zatrzymanych zadań: innych powłok, innych użytkowników , w tym zadań debugowanych (np. Przez gdb).
Stéphane Gourichon,
Dla mnie najlepsza odpowiedź, ale niezupełnie działająca. Musiałem użyć, ps -el | grep Taby znaleźć procesy w stanie „T”.
dr0i
4

Jeśli chcesz usunąć niektóre zatrzymane zadania, ale nie wszystkie, spróbuj tego:

Po pierwsze, wypisz listę zadań, otrzymasz coś takiego:

$ jobs -l

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

wyślij kill do zatrzymanego zadania, nie zrobi nic poza kolejką niż wprowadzi go na pierwszy plan, zakończy działanie

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

$ jobs -l
[3]-  4819 Stopped                 ./parse < call.txt
sergei
źródło
4

Zwykle jeśli otrzymasz tę wiadomość, musisz się dwukrotnie wylogować. Np. Najpierw Ctrl+Dwyświetla komunikat ostrzegawczy informujący o zatrzymanych zadaniach, naciśnięcie po raz drugi wyloguje cię z zabicia zleceń. To samo dotyczy poleceń logouti exitpoleceń.

Aby je zabić ręcznie, spróbuj: kill $(jobs -p).


Jeśli nie chcesz zabijać zadań z bieżącej powłoki, możesz usunąć je z tabeli aktywnych zadań bez zabijania za pomocą disownpolecenia. Na przykład

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

Zatrzymana praca może być także określana przez stan procesu ( Tznaków), co oznacza, że proces zatrzymano za pomocą sygnału, takich jak SIGSTOP, SIGTSTPlub inne (np SIGTTINlub SIGTTOU).

W przypadku, gdy jobswbudowane polecenie powłoki nie jest dostępne, zatrzymane procesy można wyświetlić za pomocą następującego polecenia:

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

Aby zabić ich wszystkich, możesz w zasadzie wpisać:

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

Oto prosty 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
kenorb
źródło