Durdurulan tüm işleri nasıl öldürebilirim?


91

Linux sunucumdan çıkmaya çalıştığımda şu mesajı alıyorum:

Durdurulan işler var.

: Bunları öldürmek için tek bir komut var mı?


U&L Q&A ile ilgili ilave örnekler: unix.stackexchange.com/questions/124428/…
slm

Şimdi ters sorunum vardı, kabuğu bıraktığımda durdurulan işler hakkında uyarmazdım! shopt -s checkjobsBenim .bashrc koymak zorunda kaldım
Sam Watkins

1
ctrl + d tuşlarına tekrar basmanız, şimdi çıkmanıza izin verir, bu sırada bu işleri öldürür
Jens Timmerman

Yanıtlar:


73

Bash altındaki tüm durdurulan işleri hızlı bir şekilde öldürmek için, şunu girin:

kill -9 `jobs -ps`

jobs -ps-pdurdurulan ( -s) işlerin işlem kimliklerini ( ) listeler .
kill -9 `jobs -ps`hepsine SIGKILL sinyalleri gönderir.


22
-1 İşleri öldürmek için

1
iş "sudo su" iken işe yaramadı. yani sudo kill `jobs -p`işe yaramadı ama açıkça PID yazarak yaptı.
user13107,

14
Bu neden bu kadar yüksek düzeyde oylanmaya başladı? Yanlış. İşlemler durdurulursa, killböyle bir işlem hiçbir şey yapmaz, işlemler durduğundan, kendilerine varsayılan olarak gönderilen SIGTERM'i (-15) işlemez.
slm

6
öldür -9 hile yapacak.
saat

84

Bunu yazmayı deneyin:

kill -9 $(jobs -p)

9
Bunu yapmalı, ama sanırım bir SIGKILL (-9) göndermeden önce ilk SIGTERM (-15) göndermeli. Belki de "öldür $ (iş-p); 3s; öldür -9 $ (iş-p)" gibi bir şey önermek daha iyi olurdu. Önce SIGTERM gönderme, işler temiz bir çıkış yapabilir (tahsis edilmiş kaynakları serbest bırakma, vb.).
REMS

3
Kevin Duke, cevabınız benim için işe yaradı. Oy kullanamadım, çünkü 15 itibarımız yok. öldür -9 $ (iş-p)

2
@rems Slm'in işaret ettiği gibi, durduruldukları için SIGTERM'i alamazlar.
Paul Gear,

1
Zsh üzerinde çalışmaz. Zsh, POS IX'in işlerle uyumlu olmaması nedeniyle .
Max Coplan

O zaman, zsh ile nasıl baş edilir?
fx-kirin

16

Kabul edilen cevap tüm işleri öldürür (bu durumda yeterlidir) ve sadece durdurulanları değil. Sadece Durdurulanları öldürmek istiyorsan, koş:

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

grep / cut bir awk komutunda birleştirilebilir: awk '/Stopped/{print $3}')
laebshade 20:15 '

2
-sKabul cevap filtreleri durdu olanlar üzerinde argüman
79E09796

12

En kolay yol aslında çıkışı hemen yeniden denemektir; bashBunu "durdurulan işleri öldür ve çık" anlamına gelecektir.


4
Bu, herhangi bir işi durdurması gerekmeyen bir HUP gönderecektir.
Stephen Niedzielski

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

2
Okumayı kolaylaştırmak için bu satır için kod biçimlendirme ekleyebilirsiniz.
drcelus

Biçimlendirmenize tekrar göz atabilir misiniz - satırın başında dört blok kullanarak bir bloğu kod olarak işaretleyin (backtick kullanmak yerine). Şu anda kodunuzda ters çubuklar kullanıp kullanmadığınızı veya backticks kullanarak kod görüntülemeyi denediğiniz net değil.
dunxd

Biçimlendirme iyi. işleri geçmemiz gerekir -p komut olarak kabul etmeyeceği terstickt'ler kullanarak backtick'ler kullanarak hata yapar.
Pzt

5

Bunun başka birine yardım etmesi durumunda - çoğu insan buradadır, çünkü başlattıkları bazı durdurma süreçleri vardır, belki kabuktan geçmişlerdir. Komuttaki değişkenlerin jobsyapamayacağı , diğer kullanıcılar tarafından durdurulmuş kök olarak işlemler bulmam gerekiyordu.

Etrafta bir miktar kazma man psbeni bu noktaya getirdi :

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

Açıklama: -abayrak tüm işlemleri gösterdiğini, ardından -oçıktıları kontrol ettiğini, her işlem hakkında hangi bilgilerin gösterileceğini söylüyor. Ben seçiyorum pid, user, cmd(komut satırı) ve statehangi süreç devlet .

Kimden 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

bu yüzden nihayet onu boruya yazdım grep T$, son sütunda T olan tüm işlemleri göster.

Ve sonra durdurulan durumda olan farklı kullanıcılardan gelen tüm işlemlerin güzel bir listesi var.

$ 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

Geçerli kabuğa bağlı işleri durdurmak için jobs -psbu yanıttan daha basittir. Olduğu söyleniyor, bu cevap sadece Ctrl-Zbir kabuğun içinde durdurulan işleri değil, tüm durdurulan işleri gösterir: diğer kabuklar, hata ayıklanan işler dahil diğer kullanıcılar (örneğin, gdb).
Stéphane Gourichon

Benim için en iyi cevap, ama tam olarak çalışmıyor. ps -el | grep T'T' durumundaki süreçleri bulmak için kullanmak zorunda kaldım .
dr0i

4

Durdurulan işleri kaldırmak ancak hepsini kaldırmak istiyorsanız, şunu deneyin:

İlk önce işleri listele, şöyle bir şey alacaksın:

$ jobs -l

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

durdurulan bir işe öldür göndermek, ön plana getirmek yerine kuyruktan başka bir şey yapmaz, sonlandırır

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

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

4

Normalde bu mesajı aldıysanız, iki kez oturumu kapatmanız gerekir. Örneğin Ctrl+D, size durdurulan işler hakkında sizi uyaracak uyarı mesajını verir, ikinci kez basmak işleri öldürmenizi engeller. Bu aynı şey logoutve exitkomutlar için de geçerlidir .

El ile onları öldürmek için deneyin: kill $(jobs -p).


İşleri şu anki kabuğunuzdan çıkarmak istemiyorsanız, disownkomutları kullanarak öldürmeden aktif işleri tablosundan kaldırabilirsiniz . Örneğin

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

Ayrıca yöntem (devlet tarafından belirlenebilir durduruldu iş Tişlem anlamına gelir karakteri) gibi sinyal ile durduruldu SIGSTOP, SIGTSTPve diğer (gibi SIGTTIN, ya da SIGTTOU).

Durumda jobsbir kabuk yerleşik komutu kullanılamaz, süreçler aşağıdaki komutu tarafından listelenen edilebilir durdu:

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

Hepsini öldürmek için temel olarak şunları yazabilirsiniz:

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

İşte basit bir 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.