Her arka plan işlemini sonlandır


10

Birkaç Stoppedarka plan sürecim var.

kill $(jobs -p)ve kill `jobs -p`hiçbir etkisi yok

kill %1, kill %2vb. işlemleri tek tek başarıyla sonlandırır

Her arka plan işlemini tek bir komutla nasıl öldürebilirim?

Ayrıca, neden ilk iki komut benim için çalışmıyor?

Linux Mint 15, 64 bit çalıştırıyorum

Yanıtlar:


10

Koşarken

Sadece bunu killve çıktı ile yapabilirsiniz gibi görünüyor jobs -p.

Misal

$ sleep 1000 &
[1] 21952
$ sleep 1000 &
[2] 21956
$ sleep 1000 &
[3] 21960

Şimdi 3 sahte işim var.

$ jobs
[1]   Running                 sleep 1000 &
[2]-  Running                 sleep 1000 &
[3]+  Running                 sleep 1000 &

Hepsini öldürün:

$ kill $(jobs -p)
[1]   Terminated              sleep 1000
[2]-  Terminated              sleep 1000
[3]+  Terminated              sleep 1000

Hepsinin gittiğini onaylamak.

$ jobs
$

Durdurulduklarında

Durdurulmuş işleriniz varsa, bunun yerine çalışmıyorsunuz.

Misal

$ kill $(jobs -p)

$ jobs
[1]+  Stopped                 sleep 1000
[2]-  Stopped                 sleep 1000
[3]   Stopped                 sleep 1000

Tamam, bu onları öldürmedi, ancak öldürme sinyali sürecin kendisi tarafından işlenemiyor, durduruldu. Bu yüzden OS'ye öldürmeyi yapmasını söyleyin. A -9bunun için.

$ kill -9 $(jobs -p)
[1]+  Killed                  sleep 1000
[2]-  Killed                  sleep 1000
[3]   Killed                  sleep 1000

Bu daha iyi.

$ jobs
$ 

Bazıları çalışırken bazıları durdurulduğunda

Bazılarının durdurulduğu ve bazılarının çalıştığı karışık bir süreç çantanız varsa, killönce bir ve ardından bir kill -9.

$ kill $(jobs -p); sleep <time>; \
    kill -18 $(jobs -p); sleep <time>; kill -9 $(jobs -p)

Süreçlerin önce kendilerini durdurmalarına izin vermek için daha fazlasına ihtiyacınız varsa süreyi biraz uzatın.

Sinyaller

Öldürmek için ne bir HUP (-1) ne de SIGTERM (-15) başarılı olamaz. Ama neden? Çünkü bu sinyaller, uygulamaya kendini sonlandırmasını söyledikleri için daha naziktir. Ancak uygulama durdurulmuş durumda olduğundan, bu sinyalleri işleyemez. Yani sen sadece bir SIGKILL (-9) kullanman yeterli.

Bütün sinyalleri görebilirsiniz killile sağlamaktadır kill -l.

$ kill -l | column -t
1)   SIGHUP       2)   SIGINT       3)   SIGQUIT      4)   SIGILL       5)   SIGTRAP
6)   SIGABRT      7)   SIGBUS       8)   SIGFPE       9)   SIGKILL      10)  SIGUSR1
11)  SIGSEGV      12)  SIGUSR2      13)  SIGPIPE      14)  SIGALRM      15)  SIGTERM
16)  SIGSTKFLT    17)  SIGCHLD      18)  SIGCONT      19)  SIGSTOP      20)  SIGTSTP
21)  SIGTTIN      22)  SIGTTOU      23)  SIGURG       24)  SIGXCPU      25)  SIGXFSZ
26)  SIGVTALRM    27)  SIGPROF      28)  SIGWINCH     29)  SIGIO        30)  SIGPWR
31)  SIGSYS       34)  SIGRTMIN     35)  SIGRTMIN+1   36)  SIGRTMIN+2   37)  SIGRTMIN+3
38)  SIGRTMIN+4   39)  SIGRTMIN+5   40)  SIGRTMIN+6   41)  SIGRTMIN+7   42)  SIGRTMIN+8
43)  SIGRTMIN+9   44)  SIGRTMIN+10  45)  SIGRTMIN+11  46)  SIGRTMIN+12  47)  SIGRTMIN+13
48)  SIGRTMIN+14  49)  SIGRTMIN+15  50)  SIGRTMAX-14  51)  SIGRTMAX-13  52)  SIGRTMAX-12
53)  SIGRTMAX-11  54)  SIGRTMAX-10  55)  SIGRTMAX-9   56)  SIGRTMAX-8   57)  SIGRTMAX-7
58)  SIGRTMAX-6   59)  SIGRTMAX-5   60)  SIGRTMAX-4   61)  SIGRTMAX-3   62)  SIGRTMAX-2
63)  SIGRTMAX-1   64)  SIGRTMAX

Çeşitli sinyaller hakkında daha fazla bilgi edinmek isterseniz, birini sinyaller sayfasına bakmaya teşvik ediyorum man 7 signal.


neden +birinci işlem -sembolümüz var, ikinci işlem sembolümüz var ve üçüncü işlem sembolümüz yok?
Ramesh

Seninle aynı sonuçları aldım. Ancak terminatebunun yerine istiyorum kill, okuduğumdan beri daha güvenli. Denedim kill -15 $(jobs -p)ama bunun bir etkisi olmadı. Durdurulan süreçlerin sadece öldürülebileceğini tahmin ettim ama sonra tekrar kill %numberdurdurulan (bireysel) süreçleri sonlandırdı.
user49888

@Ramesh +ve -ben örnekler kurma iken ben dokundu o sadece geçen işlemlerdir. +Açıkça içermeyen herhangi komutlar demekse %#o komuta hareket edecektir. Kısa çizgi ( -) dokunduğum 2. son komut.
slm

@ user49888 - çalışmalıydım kill -9 .. . süreçler neler? Geçersiz mi yoksa yetim kalmış süreçler mi?
slm

1
@ user49888 - evet işlem bir şeyin ortasındaysa, sonlandırılmadan önce herhangi bir temizleme yapma fırsatı verilmez.
slm

2

Bunu deneyebilirsiniz.

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

Ancak, işlemi sonlandırmak isterseniz, komutu şu şekilde verebilirsiniz:

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

Gönderen Wiki sayfasında Killkomutu,

Bir işleme dört şekilde SIGTERM sinyali gönderilebilir (bu durumda işlem kimliği '1234'tür):

kill 1234
kill -s TERM 1234
kill -TERM 1234
kill -15 1234

İşlem üç şekilde SIGKILL sinyali gönderilebilir :

kill -s KILL 1234
kill -KILL 1234
kill -9 1234

Bu cevapta açıklandığı gibi , bu sonlandırma ve öldürme arasındaki farktır .

Sonlandırma sinyali, SIGTERM , bir programda yakalanabilen bir sinyaldir. Genellikle arka planda çalıştırılması amaçlanan işlemler, bu sinyali yakalar ve temiz bir çıkışla sonuçlanan bir kapatma işlemi başlatır. Öldürme sinyali, SIGKILL , ele geçirilemez. Bu bir sürece gönderildiğinde, o programın aniden sonlandırılmasıyla sonuçlanır.

Örneğin, bilgisayarınızı kapattığınızda veya yeniden başlattığınızda , çalışan işlemlere genellikle bir SIGTERM gönderilir. Daha sonra, birkaç saniye sonra hala kullanılan işlemlere bir SIGKILL gönderilir, böylece kullanılan kaynaklar zorla serbest bırakılır (örn. Kullanılan dosyalar) ve kapatma sırası devam edebilir (örn. Dosya sistemlerini ayırma).


Bu, killher arka plan işlemini yapar. Ancak, terminatebunun daha güvenli olduğuna inandığım için onlara bir yol var mı?
user49888

Sonlandırmak isterseniz -15, kill komutunda kullanabilirsiniz.
Ramesh

-15burada da çalışmayacak. Bkz. A.
slm

@Ramesh - son 2 paragraf doğru değil. Bir SIGTERM gönderilmez (başlangıçta değil). İşlemler önce servis durdurma / başlatma komut dosyaları aracılığıyla durdurulmaya çalışılır. Eğer bu 9 sürecine gönderilmiş olsaydı, o zaman OP örneğinde olduğu gibi süreçler durduysa kill -9, benim örneğimdeki işe yaramazdı.
slm

1

Tamam, bununla oynamak, durdurulmuş bir işi öldürdüğünüzde (yürütmenin durdurulduğu ancak sonlandırılmadığı), o zaman ön plana getirilene kadar bitmeyeceğini görüyorum. Programlar genellikle terminalde Ctrl- düğmesine basılarak durdurulur Z. Çoğu terminal SIGSTOPbu durumda gönderir , ancak elbette kill -STOPveya ile birlikte göndermenin başka yolları da vardır kill -19.

Programın SIGTERMgönderdiği varsayılan sinyali işlemek için çalışması gerektiğinden, programın hemen bitirmemesi normal bir davranıştır kill. Dahası, bazen bir arka plan işlemine bashgönderdikten sonra SIGTERM, bir şekilde durur ( SIGTERMhala beklemede olmasına rağmen ).

(Bitirmek için tüm işleri almak için en güvenli yolu olmadan başvurmadan kill -9) göndermek için ilk SIGTERMnormal ile killgöndermek sonra, SIGCONTkalan işler, örneğin için:

kill $(jobs -p)
kill -18 $(jobs -p)

SIGCONT( 18Onlar işleyebilmesi sinyal sayıdır) ön plana durdurulan tüm işleri getirecek SIGTERMnormal şekilde.

Tüm programlar bununla bitmezse, başvurmadan önce normalde işlemi bitirmeyi deneyebileceğiniz birkaç sinyal daha vardır kill -9. Birincisi SIGHUP, genellikle diğer sonlandırma sinyallerini engelleyen birçok program yanıt verdiği için SIGHUP. Bu genellikle bir kontrol terminali kapandığında gönderilir, özellikle de biten bir sshoturum gönderildiğinde gönderilir tty. Kabuklar gibi birçok etkileşimli program diğer sonlandırma sinyallerine yanıt vermez, ancak bir sshoturum sona erdikten sonra (veya herhangi bir kontrol terminali kapandıktan sonra) çalışmaya devam etmeleri bir sorun olacağından buna cevap verecektir . Bunu denemek için

kill -1 $(jobs -p)
kill -18 $(jobs -p)

Tabii ki, sinyali işleyebilmesi için programın durdurulmadığından emin olmanız gerekir. Deneyebileceğiniz diğer sonlandırma sinyalleri SIGINT( kill -2) ve SIGQUIT( kill -3) 'dir. Ancak elbette, tüm yelpazeyi denemenin faydaları azalır ve kaçınılmaz bir duruma SIGKILL(aka kill -9) yol açabilir .


Bunu yaparsanız, bunu man signalyedeklemek için referans materyali alabilirsiniz.
slm

Bu, A'mın önerdiklerinin daha yumuşak bir şeklidir. Geçmişte bunun hala bir şeyleri tam olarak temizlemeyeceği durumlarda var, bu yüzden bir komut dosyasından yapıyorsanız, kill -9 ..yöntem çoğu durumda çalışır. Bu bazen süreçleri asılı bırakacak, bu yüzden daha fazla başarısız olacaktır. Karar vermen gereken bir değiş tokuş. Ağır teslim olmak ve her şeyi öldürmek, verileri / temizliği riske atmak ve daha yumuşak bir temizlik yapmak daha iyidir, ancak öldürmeleriniz gittikçe sertleştikçe daha fazla analiz yapmak zorunda kalmak daha iyidir.
slm

@slm, kill -9mümkün olduğunca kaçınmalısınız çünkü bu sadece programa düzgün bir şekilde temizleme şansı vermeden fişi çeker. Bazı alternatiflerle güncelleme yapacağım.
Graeme

Dediğim gibi, lezzetiniz önerdiğimden daha yumuşak, riskli bir bakış açısıyla tolere etmeye istekli ve yapmaya çalıştığınız şeylere iniyor. Benim yöntemini de kullandım. İkisi de doğru IMO. Ayrıca a kill ..; sleep <time>; kill -18 ..; uyku <zaman>; öldür -9 ... . Basically working up to the -9`.
slm

@slm, işlerin durdurulması yaygın kill -18olduğu için kesinlikle kullanılması gereken bir şeydir (ve bazı durumlarda bashgönderilmeden önce bir şekilde iş yürütmeyi durdurduğu görülür SIGTERM). Yukarıda eklendiği gibi SIGHUPdenemeye değer çünkü diğerlerine cevap vermeyen birçok program buna cevap verecektir (bir kabukla deneyin). Bunun ötesinde, evet, SIGKILLmuhtemelen kaçınılmaz olduğu kadar değerli değil .
Graeme

0

Bu, geçerli kabuğunuzdaki tüm işleri tek tek sonlandıracaktır:

while kill %; do :; done

Explanation: %listedeki son işi ifade eder, bu nedenle killsıfırdan farklı bir değer döndürene kadar döngü yapar , bu da sonlanacak başka iş olmadığı anlamına gelir.

Başka bir yaklaşım önce gönderme olabilir SIGTERM, SIGCONTböylece işleriniz devam edebilir ve ilk yapacakları şeySIGTERM .

/bin/kill $(jobs -p) && /bin/kill -CONT $(jobs -p)

(nedense yerleşik killgarip, bu yüzden burada harici bir tane kullandım).

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.