“Öldür <PID>” süreci gerçekten öldürmüyor, neden?


118

Komut satırı becerilerimi geliştirmeye çalışıyorum ve bir süreci öldüremediğim bir sorunla karşılaştım. Yazarken kill 22002200 benim PID ve süreç öldürüldü olmayan durumlar. Birkaç dakika sonra bekleyin topve içinde ps aux. Hatta sudo yazmayı bile denedim - sonuç yok.

Neden böyle olacağı hakkında bir fikrin var mı?


DÜZENLE

fgİşlemler listesini güncelleyen tuhaf bir bağımlılık buldum :

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2202 pts/0    00:00:00 top
 2258 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2620 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2621 pts/0    00:00:00 ps

Bu hangi süreçti? Sürecin geçersiz olup olmadığını kontrol ettiniz mi? Bu durumda ana süreci öldürmeniz gerekir.
htorque

İşlem top(düzenlemede listelendiği gibi). Sadece programı arka plana koymak ve daha sonra geri getirmek için denemek istedim.
Patryk

2
CTRL-z ile bir işlemi askıya alırsanız, çoğu sinyali askıya alındığı sürece engeller (yani , bir işlem yapana kadar fgveya bgişlem için)
nos

Yanıtlar:


179

İşlemler bazı sinyalleri görmezden gelebilir. SIGKILL'i gönderirseniz, onu görmezden gelemezsiniz (ve hiçbiri temizleme yapmak için yakalamaz). Deneyin:

kill -9 {PID}

Kılavuz sayfasını okuyarak daha fazla bilgi edinin:

man kill

22
Ayrıca, bazı çok özel durumlarda , bir işlemin SIGKILL'in bile işlemi öldüremediği bir zombi / feshedilmiş durumda olabileceğine dikkat edin. Bu durumda, ana süreci bulmak ve ana işlemi öldürmek zorunda kalacaksınız.
Yalan Ryan

15
Bu işlem çizginin dışına çıkarsa, KILL DASH NINE !
scottl

4
Ve bazen ebeveyn süreci yoktur, bu durumda sadece becerilirsiniz. Böyle bir işlemi kaldırmanın tek yolu makineyi yeniden başlatmaktır.
user606723 6:11

2
Kill komutunun adı birçok kullanıcı için (başlangıçta ben dahil) yanıltıcı olmaya devam ediyor. Biri "X'i öldür" deyince, bunun gerçekten X'i öldürdüğü ve başka bir şey yapmadığı anlamına gelir. Bunun bir şeyi değiştirmeyeceğini biliyorum ama keşke daha ayrıntılı bir isim
seçmişlerse

1
Ne sonra bile yok kill -9çalışmıyor ve süreç hala asılı olduğu?
Douglas Gaskell

42

Herhangi killbir parametre olmadan çağrılırsa, 15 ( SIGTERM) sinyal numarasını gönderir . Bu sinyal işlem tarafından göz ardı edilebilir. Bu sinyal, eşyalarını temizleme ve daha sonra kendi başına doğru bir şekilde bitme sürecini bildirir. Bu iyi yol.

Ayrıca SIGKILL, işlem tarafından göz ardı edilemeyecek olan 9 ( ) sinyalini "gönderebilirsiniz" . İşlem onu ​​tanımıyor bile çünkü çekirdeği işlemin kendisini değil işlemi sonlandırıyor. Bu kötü bir yol.

Biri kill -9 <pid>her zaman işe yaradığını söylüyor . Bu bir inançsızlık . kill -9Süreci bile öldürmeyen durumlar var . Örneğin, bir işlem durumu olduğunda D(kesintisiz uyku). Bu duruma, G / Ç için her beklediğinde (normalde çok uzun değil) bir süreç ortaya çıkar. Bu nedenle, bir işlem G / Ç için beklerse (örneğin, bir kusur sabit diskinde) ve düzgün bir şekilde programlanmamışsa (zaman aşımı ile), o zaman işlemi öldüremezsiniz . Ne yaptığın önemli değil. Süreci devam ettirmek için dosyayı erişilebilir hale getirmeye çalışabilirsiniz.


2
Bu çok yardımcı oldu, ağ disklerine G / Ç erişimi asılı olduğu için bunu birkaç kez deneyimledim ve neden dondurulan işlemleri öldüremediğimi merak ediyordum. Bu konuda daha fazla dokümantasyon var mı ve nasıl çözülmeli?
Sheljohn

7

İsminin öldürülmesine rağmen aslında süreçleri öldürmüyor, buna sinyaller gönderiyor. Man sayfasından:

kill - send a signal to a process

Tarafından gönderilen varsayılan sinyal kill [pid]olduğunu SIGTERM genellikle şart olmamakla birlikte sonlandırmak için süreci sorar. SIGTERM sinyalini gönderdiğinizde mutlu bir melodi çalacak bir program yazmak oldukça mümkün , ancak tavsiye edilmiyor.

Başka bir ortak sinyaldir SIGHUP genellikle yapılandırma dosyalarını yeniden okumasını bir program sormak için kullanılır.

Bir programı gerçekten öldürmek istiyorsanız, SIGKILL sinyalini kullanarak yapmanız gerekir kill -9 [pid].


2

Bir işlemi askıya alıyor olabilirsiniz (belki de terminaldeki Ctrl-Z tuşlarına basarak). Bu durumda, işleminiz donmuş olduğundan bir SIGTERM'e cevap vermeyecektir. 'Fg' komutunu çalıştırmak süreci siler, böylece sinyali alabilir ve kendiliğinden sonlanabilir. Bu, 'fg'nin neden işlem listesini güncellediğini açıklayabilir.


1
Peki ekli terminal nasıl bulunur?
ruX

0

C ++ içinden ben yaptım:

kill(4024, SIGKILL);

Ve bir linux (Ubuntu) terminalinde,

$ ps -ax | grep my_su

Çıktı şuydu:

4024 pts/1    Z+     0:00 [my_subscriber] <defunct>

Görünüşe göre, (4024) hala hayatta. Ancak, yukarıdaki "kill" ifadesi olarak adlandırılan ana süreci sonlandırdığımda, 4024 artık görünmüyordu. Şimdi “feshedilmiş” sürecin görüntülenen ve görmezden gelmeye karar veren bir çizgiden başka bir şey olmadığını yargılarım. Umarım deneyimim oradaki birine yardım edebilir. Şerefe!


0

Ayrıca kullanabilir kill -lmimarinize desteklediği sinyallerini görüntüleme ve düzgün bir sinyal göndermek için kullanmak isteyebilir sinyal hakkında daha fazla bilgi için.

Not: Başkalarının belirttiği gibi, kill -9 {PID}bir zombi süreci olmadıkça kullanılması önerilmez. Bir işlem bir SIGKILL aldığında, temizleme veya başka herhangi bir uygun prosedür olmadan derhal kapanacaktır.


0

Bu, 80 numaralı bağlantı noktasında çalışan localhost hapı için kullandığım şeydir (Açısal cli ile) 80 numaralı bağlantı noktasında çalışan uygulama bilgilerini al

sudo lsof -i tcp:80

After That 
sudo kill -9 3348

3348çalışan sürecin pidesi nerede

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.