Ctrl + C bir süreci öldüremediğinde ne yapmalı?


171

Ctrl+ Cher zaman geçerli işlemi öldürmek için çalışmaz (örneğin, bu işlem belirli ağ işlemlerinde meşgulse). Bu durumda, imlecinizdeki "^ C" harfini görürsünüz ve başka bir şey yapamazsınız.

Terminalimi kaybetmeden bu işlemi şimdi ölmeye zorlamanın en kolay yolu nedir?

Cevapların özeti: Genellikle, işlemin uyku moduna geçmesi için Ctrl+ + öğelerini kullanabilirsiniz Zve daha sonra kill -9 _process-pid_işlemin ücretini ps ve diğer araçlarla bulduğunuz yerde yapabilirsiniz . On Bash (ve muhtemelen diğer kabukları), yapabileceğiniz kill -9 %1kolay (veya genel '% N'). Eğer Ctrl+ Zçalışmıyor, başka terminali açıp gerekecek öldürmek oradan.


screenolası bir çözüm olabilir, yeni bir pencere ve killoradan süreci oluşturmanıza izin verir .
Bobby

2
Zaten bir ekranda olduğunuzu varsayarak :)
Dustin Boswell

Yanıtlar:


119

Neden Ctrl+ Cçalışmadığı problemini anlamak için , ona bastığınızda ne olacağını anlamak çok yararlı olacaktır:

Çoğu kabuk Ctrl+ ' şu anda ön planda çalışan programa SIGINT sinyali Cgöndermek' için bağlanır . Man sinyalleriyle farklı sinyalleri okuyabilirsiniz :

 SIGINT        2       Term    Interrupt from keyboard

Onlar yok sayabilirsiniz gibi programlar bu sinyal yok sayabilirsiniz SIGTSTP yanı:

 SIGTSTP   18,20,24    Stop    Stop typed at tty

( Ctrl+ Düğmesine bastığınızda çoğu kabuğun yaptığı Zbudur, bu yüzden çalışması garanti edilmez.)

İşlem tarafından göz ardı edilemeyecek bazı sinyaller var: SIGKILL , SIGSTOP ve diğerleri. Bu sinyalleri kill komutu ile gönderebilirsiniz . Bu nedenle, asılı / zombi oluşturma sürecinizi öldürmek için, sadece işlem kimliğinizi (PID) bulun . Örneğin, kullanın pgrepveya pssonra killda:

 % kill -9 PID

13
Sadece bir açıklama. "Zombinin" teknik olarak bir işlem durumu olduğunu ve burada "zombieying" ile kastettiğinizle aynı olmadığını unutmayın. (Ebeveyninin beklememiş olduğu sonlandırılmış bir işlem () - zombi ( Z) durumundadır. Bu durumda, artık sinyalleri tutamaz.)
Stéphane Gimenez

ne yazık ki, bazen ctrl + c, ctrl + z ve ctrl + \ all hiçbir şey yapmaz ve işlem sudo işlemini gerçekleştirir (parola olmadan izin verilir), böylece işleme yalnızca bir sinyal gönderemezsiniz.
Michael

112

Eğer Ctrl+ C(SIGINT) çalışmıyor, denemek Ctrl+ \(SIGQUIT sinyalini). Sonra Ctrl+ Z(SIGTSTP) deneyin . Bu sizi bir kabuk istemine döndürürse killişlem kimliğini yapın. (Eğer belirleyebileceğini SIGTERM sinyali, Bu varsayılan kill -TERM. Bazı kabukları, kullanmak mümkün olabilir %1. PID başvurmak için) Bu işe yaramazsa, başka bir terminal veya SSH oturumu gidip yapmak killveya kill -TERMüzerinde işlem kimliği. Sadece son çare olarak yapmanız gereken kill -KILLaka kill -9o sürecini, açık dosyaları senkronize, temiz iptal vb geçici dosyalarını, yakın ağ bağlantıları, kaldırmak için herhangi bir şans vermez olarak,


32

Programı askıya almak ve arka plana koymak için Ctrl-Z tuşlarına basın :

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(Tekrar kullanarak ön plana geri yükleyin fg)

Daha sonra, işlem kimliğini vererek (bunu sizden alırsınız ) yapabilirsiniz killya kill -9da yapabilirsiniz ps a.


13
Bash ile son arka plandaki programın pidini içeren özel bir değişken kill $!olarak yapabilirsiniz $!.
Lloeki

@Lloeki Benim için çalışmıyor (en azından güvenilir değil). bgDeğişken atanmış bir değer almadan önce bir kez yapmam gerekiyor .
Daniel Beck

2
@Daniel, doğru. Son arka plandaki işlemi söylediğim gibi , bu nedenle bgCtrl + Z'den hemen sonra askıya alınması gerekiyor.
Lloeki

2
Not: Bu sadece bir numara değildir , aynı isimde çalışan birden fazla işleminiz varsa, psçıktıyı (veya killall) kullanmak oldukça risklidir. ps -e -o pid,commandpid + full args sağlayacaktır, sadece program adı değil, yine ayrımcılık yapmak için yeterli olmayabilir. Buna karşılık $!kesin bir vuruş.
Lloeki

1
@Lloeki Katılmıyorum. ps aSistemimdeki örnek çıktı satırı : Aynı komutun ( ) 27721 s000 T 0:00.09 topkaç tane askıya alınmış ( T, bence) örneği topaynı tty ( s000) içinde çalışıyorsunuz?
Daniel Beck

30

Bu bağlantıya da bakınız .

Ctrl+ Z: bir işlemi duraklatır.

Ctrl+ C: kibarca sürecin şimdi kapatılmasını isteyin.

Ctrl+ \: şu anda ön planda olan işlemi acımasızca öldürmek


"ctrl"+ "\"benim için işe yaramadı
Benyamin Jafari

13

Genellikle, işlemi hala durdurabilir ( Ctrl+ Z) ve sonra kullanabilirsiniz kill -9. Çünkü kill -9, önce PID işlemine ihtiyacınız var . Arka plan işleri için, kill -9 %1bunu yapmanın en kolay yoludur - öldürmek istediğiniz arka plan işinin sayısının ne olduğundan emin değilseniz, koşun jobs.

Alternatif olarak, işlem kimliğini

ps

Sonra koşabilirsin

kill -9 <Appropriate PID from ps output>

5

Bash (ve diğer mermiler?) İçin daha basit bir çözüm:

Ctrl-z      followed by     kill -9 %1

'% 1', öldürülen iş numarasını ifade eder. Zaten uyuyan başka işler varsa '% 2' olabilir (veya başka bir şey). Ctrl-z'ye tıkladığınızda hangi iş numarasının olduğunu görebilirsiniz:

[1]+  Stopped                 <process name>

'Öldür' ifadesinin, kabuğun / bin / kill değil, öldürmenin sürümü olduğunu unutmayın.


4

1) Konsoldaysanız ve çok kullanıcılı moddaysanız, CTRL-ALT-Fn tuşlarına basıp başka bir ekranda oturum açabilirsiniz, ps -ef | grep <myprocessname>veya öğesini kullanın pidof <myprocessname>ve ardından işlemi ID numarasına göre öldürebilirsiniz -9.

2) Uzaktan bağlandıysanız, başka bir terminal oturumu ile aynısını yapın.

Ayrıca , çalışan işlemleri seçerek öldürmenize olanak tanıyan, üst kısmın çok yönlü bir sürümü olan Htop'u yükleyerek hayatı biraz daha kolaylaştırabilirsiniz . Çoğu dağıtım bir depoda durdu.

3) eğer bir ssh oturumunda (örneğin başka bir sisteme) takılı kalmışsanız, escape tuşu olan tilde (~) tuşuna basmayı deneyin ve ardından ana bilgisayar oturumuna geri dönmek için CTRL-Z tuşlarına basın. Sıkışmış ssh işlemini öldürebilir veya çoğu eşik eylemsizlik süresinden sonra yapılan eşik zaman aşımına uğrayabilir.


0

Eğer tmux veya ekran kullanıyorsanız ve yukarıdakilerin hiçbiri işe yaramazsa, bölmeyi hala öldürebilirsiniz <prefix> x, o zaman süreç de öldürülür.


0

/ Etc / profilinizde SIGINT (2) ile ayarlanmış bir tuzak olabilir. Eğer öyleyse, onu kaldırın. Çıkış yapıp tekrar giriş yapın, iyi olmalısınız.

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.