Ne zaman bir süreci öldürmemeliyim?


401

Çalıştırmak için her zaman çok tereddütüm var kill -9ama diğer yöneticilerin neredeyse rutin olarak yaptıklarını görüyorum.

Muhtemelen makul bir orta yol olduğunu düşünüyorum.

  1. Ne zaman ve neden kill -9kullanılmalı? Ne zaman ve neden olmasın?
  2. Yapmadan önce ne denenmeli?
  3. Ne tür bir "asılı" işlemin hata ayıklaması başka sorunlara neden olabilir?

7
İyi bir ilgili SO cevap .
jw013

Yanıtlar:


362

Genel olarak, hedef sürecin kendisinden sonra temizlenmesi için bir şans vermek için önce ( ) kullanmadan önce ( ya da çoğu sistemde killkısa ) kullanmalısınız. (İşlemler yakalayamaz veya yok sayamaz , ancak sık sık yakalar ve yakalar .) Sürece ne yaptığını ve temizlenmesini tamamlama şansı vermezseniz, çevresinde bozuk dosyalar (veya başka bir durumda) bırakabilir. yeniden başlatıldıktan sonra anlayamayacak.kill -s TERMkill -15kill -9kill -s KILLSIGKILLSIGTERM

strace/ truss, ltraceVe gdbsıkışmış bir süreç sıkıştı neden bakmak için iyi fikirler genellikle. ( truss -uSolaris'te özellikle yararlıdır; ltracekütüphane çağrıları için kullanılamaz biçimde bir argüman sunuyorum.) Solaris /proc, bazıları Linux'a taşınan faydalı temelli araçlara da sahiptir . ( pstackgenellikle yardımcı olur).


67
Bunun asıl nedeni, SIGKILL'i gönderme alışkanlığını yaşarsanız, örneğin sizin veya şirketiniz için önemli bir veritabanını bozacak bir programa ulaştığınızda, gerçekten pişman olacağınızdır. kill -9son çare olarak kullanmakta, son çare olarak vurgu yapmaktadır; son başvurudan önce kullanan yöneticiler a) çok iyi bir yönetici olmayı anlamamaktadır ve b) bir üretim sisteminde olmamalıdır.
Arcege

9
@Mikel Bunun için başka bir şey, bazen SIGINT / SIGTERM'e yanıt vermezse, bir uygulamayı SIGQUIT veya SIGSEGV gibi bir sinyale temizlemek için kandırmak en iyisidir. Örneğin, bir tam ekran 3-D uygulaması veya hatta Xorg. SIGQUIT'i kullanarak hiçbir şeyi temizleme şansına sahip olmayacak, ancak bir segment arızası olduğunu düşünerek kandırmak ve temizlemek ve çıkmaktan başka çaresi olmadığını hissedecek.
penguin359

12
@Arcege -9 ile öldürüldüğünde verileri bozan bir veritabanı kullanmanın, sonuçta kullanmaya değer bir veritabanı olduğunu düşünüyor musunuz? iirc, mysql, bdb, pg, etc ... -9 ile öldürüldüğünde hepsi iyi davranır.
dhruvbird

13
killall -9 java ftw
dmourati

23
@dhruvbird: DB'lerin kurşun geçirmez yelekler ile donatılmaları gerektiği için, gerekmediğinde onları vurmanız gerektiği anlamına gelmez. Arcege'nin söylediği kadar riskli olmadığı konusunda haklı olsanız da, bu konunun hala riskli olduğunu ve son çare olması gerektiğini düşünüyorum.
iconoclast

228

Randal Schwartz, listelerde sık sık "Yararsız kullanımı (x)" yayınlamak için kullanılır. Böyle bir yazı hakkında idi kill -9. Nedenleri ve takip etmek için bir reçete içerir. İşte yeniden oluşturulmuş bir versiyon (aşağıda alıntılanmıştır).

(Abomination alıntı)

Hayır hayır hayır. Kill -9 kullanmayın.

Sürece temiz bir şekilde şans vermez:

1) soket bağlantılarını kapatın

2) geçici dosyaları temizlemek

3) çocuklarına gittiğini söyler

4) terminal özelliklerini sıfırlayın

ve böyle devam eder.

Genellikle 15 gönderin ve bir veya iki saniye bekleyin ve bu işe yaramazsa, 2 gönderin ve bu işe yaramazsa, 1 gönderin.

Kill -9 kullanmayın. Saksıyı toparlamak için biçerdöveri dışarı çıkarmayın.

Usenet'in başka bir işe yaramaz kullanımı

(.imza)


12
İşlem sona erdiğinde işletim sistemi açık dosya tanımlayıcılarını (soketler dahil) kapatmaz mı?
Brian Gordon

3
Evet olacak. Ancak, müşterileri bağlıyken bir sunucu işlemini öldürdüğünüzü varsayalım, sonra istemciler sunucunun zaman aşımına uğramadan önce gittiğini fark etmeyeceklerdir.
Björn Lindqvist

45
Ah evet, eski "eğer herhangi bir şekilde kusurluysan, onu kullanmaya aptalsın" argümanı.
Timmmm

3
Ya da söz konusu işlem şirketinizin üretimi ise, kullanması aptalca
Warren P

3
Bir süreç öldürülürse, soket eşe RST'yi gönderir, eğer süreç sanki sokette kapanır ya da kapatılırsa, soket FIN gönderir. Gereken zaman aşımı yok. Zaman aşımı durumu, yalnızca güç kesildiğinde veya ağ kablosu çıkarıldığında ortaya çıkar.
ctrl-alt-delor

78

Her zaman tamam kill -9olmalı, güç kablosunu çekerek her zaman tamam olması gerektiği gibi. Anti-sosyal olabilir ve yapmak için biraz iyileşme bırakabilir, ancak çalışması gerekir ve sabırsız için güçlü bir araçtır.

Bunu ilk önce düz öldürmeyi (15) deneyecek olan biri olarak söylüyorum, çünkü bir programa bir temizlik yapma şansı veriyor - belki de sadece "sig 15'ten çıkacak bir kütüğe" yazıyor. Fakat bir cinayet -9'daki kötü davranış hakkında hiçbir şikayeti kabul etmiyorum.

Sebep: Bol miktarda müşteri bunu programcıların tercih edeceği şeylere yapıyor. Rastgele öldürme -9 testi, iyi ve adil bir test senaryosudur ve sisteminiz bunu ele almazsa, sisteminiz bozulur.


2
"Random kill -9" için nasıl test yaparsınız? Öldürdüğünde -9, işin biter ve biter.
Karel Bílek

18
@Karel: Sisteminizin daha sonra iyileşip iyileşmeyeceğini test ediyor ve SIGKILL zamanında işlenen tüm karışık işlemleri temizliyorsunuz.
Tadeusz A. Kadłubowski

7
Tıpkı kill -9fişi çekip çekmemenin doğru olmadığı gibi yapması uygun değildir. Elbette başka seçeneğiniz olmadığı durumlar varken, bu son çare hareketi olmalı. Tabii ki, güç kablosunu çekerek veya kill -9uygulamayı veya düzgün hiç değilse yeniden OS önlenmesi gibi olumsuz etkilere sahip olmamalıdır, ama bok olur ve (önerilir yollarını kullanarak kill [-15]) ya da düzenli kapatma oluşabilir karmaşa kaçınarak yardımcı olacaktır programları ve işletim sistemlerini düzenli olarak kesersiniz. Her durumda, kodun sağlamlığından bağımsız olarak her zaman veri kaybı riski vardır.
jlliagre

7
Michael'ın 'Tamam' derken neyi kastettiğinden şüpheleniyorum, programınızın bu durumu dikkatlice ele alması ve yeniden başlatma işleminde bir çeşit temizleme işlemi yapması gerektiğidir. Örneğin, PID dosyalarını ve benzerlerini temizlemek, sadece oyuncaklarını çocuk arabasından fırlatıp atmayı reddetmek yerine.
gerryk

2
@gerryk Gerçekten de yapmalılar, fakat mesele şu ki, durum ne olursa olsun çevre bazı insanlar bu cevabı "öldürme lisansı" olarak alacaklar. Bu sorumsuz bir tutum.
jlliagre

39

Kill -9'u bulaşık makinesine mutfak aletleri fırlattığım şekilde kullanıyorum: bir mutfak aleti bulaşık makinesinde yıkılırsa istemiyorum.

Aynı şey çoğu program için de geçerlidir (veritabanları bile): işleri hiçbir şey yapmadan öldüremezsem, gerçekten kullanmak istemiyorum. (Ve eğer sahip olmadıkları zamanlarda verilerini sürdürdüğünü iddia etmenizi teşvik eden bu veritabanlarından olmayan birini kullanıyorsanız: peki, ne yaptığınızı düşünmeye başlamanın zamanı geldi sanırım).

Çünkü gerçek dünyada her şey herhangi bir nedenle herhangi bir zamanda aşağı gidebilir.

İnsanlar gerektiğini çöker karşı toleransı olan yazılım geliştiriyorum. Özellikle sunucularda. İşlerin kırılacağını, çökeceğini vb. Varsayan bir yazılımı nasıl tasarlayacağınızı öğrenmelisiniz.

Aynı masaüstü yazılımı için de geçerli. Tarayıcımı kapatmak istediğimde genellikle kapatılması YAŞ alır. Orada hiçbir şey benim tarayıcı ihtiyacı olduğu saniyelik en fazla birkaç sürer yapmak. Kapatmamı istediğimde bunu derhal yapmalı. Olmazsa, o zaman öldür -9'u çıkarırız ve yaparız.


4
Bir sürecin böyle bir başarısızlığa karşı hoşgörülü olmak için yazılması gerektiğine katılıyorum, ancak bunu yapmanın hala kötü bir uygulama olduğunu düşünüyorum. Bir veritabanı kurtarılır, ancak kaba durdurmayı algılayabilir ve yeniden başlatıldığında önemli kurtarma kontrolünü tetikleyebilir. Peki ya bir sürecin hizmet ettiği talepler? Hepsi anında kesilecek, müşterilerin de hataları olabilir ve başarısız olabilir mi?
Daniel James Bryars

3
Hiçbir zaman öldürülemeyen bir veritabanı, düzgün bir şekilde güvenilir bir veritabanı değildir. Tutarlılık istiyorsanız bu oldukça basit bir gereksinimdir. Müşterilere gelince: bağlantı koptuğunda veri toplanır ve bozulursa, kötü şekilde de tasarlanırlar. Hizmet kaybını ele almanın yolu fazlalık ve otomatik yük devretme / yeniden deneme stratejileridir. Genellikle hızlı bir şekilde başarısız olan sistemin çoğu için kurtarmaya çalışmak tercih edilir.
bord

4
@borud Mükemmel yazılmış bir yazılım olmayabilir, ancak insanların her zaman kullandığı yazılımdır. Hangi sistem yöneticileri, her zaman kusursuz biçimde yazılmış bir yazılımı seçebilme lüksünü, ani bozulmadan her zaman zarafetle kurtarma lüksüne sahip? Çok değil. Şahsen kapatma komut dosyalarını kullanıyorum ve bununla işlemleri başlat / durdur. Kapatma komut dosyasına yanıt vermiyorlarsa (işlem için uygun bir sinyal verir), -9'u öldürürüm.
Steve Sether

2
Aletler ile ilgili temel şeyler ve daha karmaşık yemekler arasında hiçbir fark yoktur. Aradaki fark aşçı. (Ancak, benim kadar yemek pişirmek için zaman harcıyorsanız, mutfak gereçlerinde sağlamlığın minimum bir gereksinim olduğunu ve mutfak gereçlerini tüketicilere satan insanların çoğunun kötü bir aletten habersiz olamayacağının farkındasınız.)
borud

1
Yani insanları özensiz olmaya teşvik ediyorsun, çünkü işleri doğru yapmak zor mu? Giderek artan operasyonel ortamlarda gittikçe daha fazla sayıda yazılım çalıştırılmaktadır. Düzgün kapanmazsa telaşlı bir yazılım yazarsanız, işverenleri sizi bir geliştirici olarak işe almaya ikna etmek zor olacaktır.
Borud

10

Diğer cevaplarda bahsedilmeyen, kill -9hiç işlem yapılmayan, bir sürecin <defunct>öldürüldüğü ve öldürülemediği bir durumdur :

Ebeveynleri yerinde olan bir <defunct> işlemini nasıl öldürebilirim?

Bir süreç için geçersiz olan nedir ve neden öldürülmez?

Bu yüzden, kill -9bir <defunct>sürece başlamadan önce ps -efebeveyninin ne olduğunu görmek için koşun ve ebeveyninde -15(TERM) veya -2(INT) ve son olarak -9(KILL) dene.

Not: Ne ps -efyapar ?

Daha sonra düzenleme ve dikkat: İşlemleri, ebeveynlerini veya çocuklarını öldürürken dikkatli olun, çünkü dosyaları açılmış veya bozuk bırakmış olabilirler, bağlantılar bitmemiş, veritabanlarını vs. bozabilir kill -9, bir işlem için ne yaptığınızı bilmiyorsanız , yalnızca son çare olarak kullanın. Öldürmeyi çalıştırmanız gerekirse, kullanmadan önce yukarıda belirtilen sinyalleri kullanın.-9 (KILL)


6

Asla asla yapma kill -9 1. Ayrıca mount` gibi belirli işlemlerde bir öldürme yapmaktan kaçının. Çok fazla işlemi öldürmek zorunda kaldığımda (örneğin bir X oturumu kapanır ve belirli bir kullanıcının tüm işlemlerini öldürmek zorunda kalırım) işlemlerin sırasını tersine çeviririm. Örneğin:

ps -ef|remove all processes not matching a certain criteria| awk '{print $2}'|ruby -e '$A=stdin.readlines; A.reverse.each{|a| puts "kill -9 #{a}"}'|bash

Unutmayın killbir süreci durdurmak ve kaynaklarını serbest bırakmıyor. Tek yaptığı, sürece bir SIGKILL sinyali göndermek; asılı olan bir işlemle kapatabilirsiniz.


1
Aşırı oy başka biriydi. Ancak hangi kaynaklar serbest bırakılmıyor? Sadece sürecin normal temizliğini yapamayacağını mı söylüyorsun? Dosya kilitleri, semaforlar vb. Ayrıntılı olabilir misiniz?
Mikel

Görünüşe göre SysV paylaşılan hafıza ve semaforların en azından temizlenmesi gerekiyor. archives.postgresql.org/pgsql-general/2006-10/msg01065.php
Mikel

8
Bu cevap, kafa karıştırıcı ve yanlış kısımdır. kill -9 1sadece çoğu birlik altında görmezden gelinir. Önlemek için gerek yok kill -9için mount, ama ya bunun bir anlamı yok. “İşlemlerin sırasını tersine çevirmek” ile ne demek istediğinizi bilmiyorum. kill -9bir süreci durdurma (öldürme), şikayet etme şansı vermeksizin, ancak işlemin kesilemez bir sistem çağrısında olması durumunda öldürme hemen gerçekleşmez . Bir süreci öldürmek kill -9çoğu kaynağı serbest bırakır, ancak hepsini değil .
Gilles

5

Willy-nilly süreçlerini öldürmek düzgün bir hamle değil: veriler kaybolabilir, kötü tasarlanmış uygulamalar kendilerini yeniden yüklemeden düzeltilemeyecek kadar ince yollarla kırabilirler .. ama tamamen neyin güvenli olduğunu ve neyin güvenli olmadığını bilmeye bağlıdır. verilen durum. ve risk altında ne olurdu. Kullanıcı bir sürecin ne olduğu veya ne yapılması gerektiği ve ne gibi kısıtlamalar olduğu hakkında bir fikre sahip olmalı (disk IOPS, rss / swap) ve uzun süren bir işlemin ne kadar zaman alacağını tahmin edebilmelidir (bir dosya kopyası, mp3 reencoding, e-posta taşıma, yedekleme, [en sevdiğiniz zaman ayırıcı burada].)

Ayrıca, SIGKILLbir ihaleye yollama , onu öldürme garantisi değildir. Bir sistemde sıkışmışsa veya zaten zombi ( Zin ps) ise, zombi olmaya devam edebilir. Bu genellikle ^ Z uzun süren bir işlemdir ve bgdenemeden önce unutmayı kill -9gerektirir. Basit bir fgstdin / stdout'u tekrar bağlar ve muhtemelen işlemin engeli kaldırır, ardından genellikle işlem sonlandırılır. Başka bir yerde veya başka bir çekirdek kilitlenme biçiminde sıkışmışsa, yalnızca bir yeniden başlatma işlemi kaldırabilir. ( SIGKILLÇekirdek tarafından işlendikten sonra Zombie işlemleri çoktan ölmüştür (başka bir kullanıcı kodu kullanılmayacaktır), genellikle bitmeyen bir süreç için bir çekirdek nedeni vardır (işlemin bitmesini beklerken "engellenme" ye benzer).)

Ayrıca, bir süreci ve tüm çocuklarını öldürmek istiyorsanız , yalnızca PID'nin kendisini değilkill , olumsuzlanan PID'yi arama alışkanlığına da sahip olun . Orada hiçbir garantisi var SIGHUP, SIGPIPEya SIGINTveya diğer sinyaller ondan sonra temizlik ve temizleme için disowned süreçler (melez hatırlayın?) Can sıkıcı bir demet sahip.

Bonus kötülük: kill -9 -1biraz daha zararlıdır kill -9 1(Atma, önemli olmayan bir VM'de ne olacağını görmek istemiyorsanız, root olarak yapmayın)


3

Neden kill -9normal bir işlem yapmak istemiyorsunuz

Göre man 7 signal:

SIGKILL ve SIGSTOP sinyalleri yakalanamaz, engellenemez veya göz ardı edilemez.

Bu, bu sinyallerden birini alan uygulamanın herhangi bir kapatma davranışı yapmak için onları "yakalayamayacağı" anlamına gelir.

kill -9Bir sürece başlamadan önce yapmanız gerekenler

Sinyali, gönderdiğiniz işleme göndermeden önce aşağıdakileri yaptığınızdan emin olmalısınız:

  1. Sürecin meşgul olmadığından emin olun (yani "iş" yapıyor); kill -9Sürece bir a gönderilmesi , esasen bu verilerin kaybolmasına neden olacaktır.
  2. İşlem yanıt vermeyen bir veritabanıysa, ilk önce önbelleklerini temizlediğinden emin olun. Bazı veritabanları, önbelleğinin boşaltılmasını zorlamak için sürece başka sinyaller göndermeyi de destekler.

3

Bu sorunu otomatikleştirmeye yardımcı olan bir komut dosyası oluşturdum.

Stackoverflow'a çok benzeyen bir sorudaki tam cevabım 2'ye dayanıyor .

Bütün açıklamaları orada okuyabilirsin. Sadece öneriyoruz Özetlemek gerekirse SIGTERMve SIGKILLhatta SIGTERM, SIGINTve SIGKILL. Ancak tam cevapta daha fazla seçenek veriyorum.

Lütfen, öldürmek için github deposundan indirmek (klon) çekinmeyin 1

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.