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


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

Durdurulan işler var.

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


80
2018-02-25 10:07


Menşei


U & L Soru ve Cevaplarına ek örnekler: unix.stackexchange.com/questions/124428/... - slm
Şu anda karşı problemim vardı, kabuğunu bıraktığımda durdurulan işler konusunda uyarmayacağım! Koymak zorunda kaldı shopt -s checkjobs benim .bashrc - Sam Watkins
tekrar ctrl + d tuşlarına basın, şimdi çıkmanıza izin verecek, bu işleri bu süreçte öldürecek - Jens Timmerman


Cevaplar:


Bash altında çalışan tüm işleri hızla öldürmek için şunu girin:

kill `jobs -ps`

jobs -ps Durdurulan işlerin işlem kimliğini listeler. kill `jobs -ps` Durdurulan tüm işlere TERM sinyali gönderin.


69
2018-02-25 10:15



"İşleri Öldür" için -1 - Tibor
İş "sudo su" olduğunda işe yaramadı. diğer bir deyişle sudo kill `jobs -p` çalışmadı ama açıkça PID yazarak yaptı. - user13107
Bu neden bu kadar yüksek oldu? Yanlış. Süreçler durdurulursa, o zaman kill Bunun gibi hiçbir şey yapmaz, süreçler durduğundan, varsayılan olarak onlara gönderilen SIGTERM (-15) işlemez. - slm
-9 öldürmek hile yapacak. - Blossoming_Flower
Açıkça yanlış cevap! - mrangry777


Bunu yazmayı deneyin:

kill -9 $(jobs -p)

76
2018-02-25 10:14



Bunu yapmalı, ama SIGKILL (-9) göndermeden önce önce SIGTERM (-15) göndermelidir. Bu yüzden belki de "$ (jobs -p) kill; 3s; kill -9 $ (jobs -p)" gibi bir şey önermek daha iyi olurdu. SIGTERM'i göndermek önce işler temiz bir çıkış yapabilir (tahsis edilen kaynakları serbest bırakabilir, vb.). - rems
Kevin Duke, cevabın benim için çalışan cevap. Oy veremedim çünkü itibarımda 15 tane yok. -9 $ öldür (iş -p)
@rems Hariç tutulduğu gibi, slm işaretlendiğinde SIGTERM'i alamazlar çünkü durduruyorlar. - Paul Gear
Zsh üzerinde çalışmıyor. Nedeniyle zsh POS olmuyor  IX işlerle uyumlu. - Max Coplan


Kabul edilen cevap, sadece durdurulanları değil, tüm işleri (bu durumda yeterli olan) öldürecektir. Sadece Durdurulmuş olanları öldürmek isterseniz, şunu çalıştırın:

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

16
2018-03-08 18:04



grep / cut bir awk komutunda birleştirilebilir: awk '/Stopped/{print $3}') - laebshade
-s kabul edilen yanıttaki argüman sadece durdurulanları filtreler - 79E09796


En kolay yol aslında hemen çıkışı hemen yeniden denemek; bash Bunu "durdurulan tüm işleri öldür ve çık" anlamına gelecektir.


12
2018-03-08 18:13



Bu, herhangi bir işi zorunlu olarak durmayan bir HUP gönderecektir. - Stephen Niedzielski


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

7
2018-02-26 10:22



Okumayı kolaylaştırmak için bu satırın kod formatlamasını ekleyebilirsiniz. - drcelus
Biçimlendirmenize tekrar göz atabilir misiniz? Bir bloğu kod olarak işaretlemek için satırın başlangıcında dört boşluk kullanın (backtick kullanmak yerine). Şu anda kodunuzda backticks kullanıp kullanmadığınızı veya backtick'leri kullanarak kod görüntüleyip görüntülemediğiniz açık değildir. - dunxd
Biçimlendirme iyi. İşleri bir komut olarak düşünmeyecek şekilde backticks kullanarak geçirmeliyiz ve bir hata atacaktır. - monu


Bazı durdurulan işleri kaldırmak istiyorsanız, hepsini değil, şunu deneyin:

İlk önce, işleri sırala, böyle bir şey alacaksın:

$ jobs -l

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

durdurulan bir işe öldürmek, sıradan başka bir şey yapmaz ön planda getirmek yerine, sonlanacak

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

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

4
2018-05-30 04:16





Normalde bu mesajı alırsanız, iki kez çıkış yapmanız gerekir. Örneğin. ilk Kontrol D size durdurulan işler hakkında sizi bilgilendirmek için uyarı mesajı verir, ikinci kez basmak sizi işten çıkarır. Bu aynısı için de geçerlidir logout ve exit emreder.

Onları elle öldürmek için şunu deneyin: kill $(jobs -p).


Mevcut kabuğunuzdaki işleri öldürmek istemiyorsanız, bunları öldürmeden etkin işlerin masasından kaldırabilirsiniz. disown Komut. Örneğin.

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

Durdurulan işler de sürecin durumuyla belirlenebilir (T karakter) yani işlemin SIGSTOP, SIGTSTP veya başka (gibi SIGTTINveya SIGTTOU).

Ne zaman jobs bir kabuk yerleşik komutu mevcut değildir, durdurulmuş işlemler aşağıdaki komutla listelenebilir:

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

Hepsini öldürmek için temel olarak 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

4
2018-02-19 20:46





Sadece bu durum başkasına yardım ederse - çoğu insan buradadır, çünkü başlattıkları bazı durdurulan süreçler vardır. Kök olarak, diğer kullanıcılar tarafından durdurulmuş süreçleri bulmam gerekiyordu. jobs komut yapmaz.

Etrafında biraz kazma man ps bana şunu getirdi:

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

Açıklama: -a bayrak tüm süreçleri gösterir, sonra -o çıkışları kontrol eder, her işlemle ilgili bilgi gösterilecektir. Ben seçiyorum pid, user, cmd (komut satırı) ve state, hangisi süreç durumu.

itibaren 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

sonunda nihayet grep T$ diyor ki, bana son sütunda T olan tüm süreçleri göster.

Ve sonra durdurulan durumdaki farklı kullanıcılardan tüm süreçlerin güzel bir listesini 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

4
2018-02-26 06:47



Mevcut kabuklara eklenmiş işleri durdurmak için jobs -ps bu cevaptan daha basittir. Bu cevap, sadece bu yolla durdurulan işleri göstermiyor. Ctrl-Z bir kabukta, ama tüm durdurulan işler: diğer kabuklar, diğer kullanıcılarHata ayıklanan işler dahil (ör. gdb tarafından). - Stéphane Gourichon