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ć?


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.


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)

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)

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ź”.


4
To wyśle ​​HUP, który niekoniecznie zatrzymuje jakiekolwiek zadania.
— Stephen Niedzielski

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

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.