Bir işlemi kesintiye uğratmak yerine Unix'te sonlandırma


12

At Unixkomut satırında eğer basın Ctrl-Cziyade bunun kesmeler, bir işlemi sonlandırmak ve ben istemi kabuğuna dönmez.

Yani, şu iki sorum var:

    1. Kesilen tüm işlemlerin listesini görebilmemin ve bitirebileceğim bir yol var mı?
    1. Bir işlemi yarıda kesmek yerine sonlandırmak için hangi tuş kombinasyonuna basın?

Yanıtlar:


20

Ctrl+ Cgönderir SIGINT. Varsayılan olarak bu, uygulamayı sonlandırır.

Ctrl-ZBir uygulamayı bash'da askıya alan ile karıştırıyorsunuz .


7

Tarihsel olarak tuş vuruşlarına bağlı üç sinyal vardı.

  • SIGINT (Kesme) genellikle Ctrl+ CveyaDel
  • SIGQUIT - Quit - Genellikle Ctrl+\
  • SIGSUSP Askıya Al - Genellikle Ctrl+Z

Bazı * nix aromalarında bağlı başka sinyaller de vardır, komutunu kullanarak klavye bağlantılarını kontrol edebilirsiniz.

stty -a

Sistemimde OS / X, bu aşağıdaki çıktıyı üretir

speed 9600 baud; 65 rows; 213 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
    -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
    -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
    -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
    eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
    min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
    stop = ^S; susp = ^Z; time = 0; werase = ^W;

Lütfen bu durumda kill'in mevcut giriş arabelleğinin silinmesiyle ilgili bir KILL sinyali olmadığını unutmayın.

SIGQUIT kullanarak işlemleri durdurmada daha başarılı olabilirsiniz, ancak süreç sinyali yakalayıp yok sayabileceğinden bu doğru olmayabilir.

Süreç kesmeyi yakalayıp yoksaydığı veya çıktığı için "kesintiye uğramış" süreçlerin bir listesi yoktur. İşleri yazarak askıya alınan işlemlerin bir listesini alabilirsiniz


^ Q ve ^ S gösterme (sizin gibi) olması, ancak stty -ixongeçmeleri için ayarlanmış olması ilginç . Onların değişeceğini düşünürdüm <undef>.
sonraki duyuruya kadar duraklatıldı.

OS X kutumun veya Debian Lenny kutumun man sayfalarında SIGSUSP bulamıyorum. SIGTSTP gibi görünüyor.
dmckee --- eski moderatör kedi yavrusu

DEL - ah, Plan 9 ...
new123456

5

Çok sayıda doğru cevap, ama hiçbiri tam değil.

  1. Diğerlerinin söylediği gibi: Control-C genellikle unix sinyal SIGINT'i gönderir ve varsayılan davranış (onu geçersiz kılmayan programlardan) "işlemi sonlandır" dır. Program bu sinyali yoksayabilir veya isterse farklı bir işlem yapabilir.
  2. SIGQUIT öğesini Control- \ ile klavyeden de gönderebilirsiniz. Buradaki fark, varsayılan olarak işlemin bir çekirdek dosya yazması ve ardından çıkmasıdır. Program bu sinyali yoksayabilir veya isterse farklı bir işlem yapabilir.
  3. Aşırı önyargı ile ve işlemin durmasına izin vermeden sonlandırmak için, varsayılan olarak herhangi bir tuşa bağlı olmayan SIGKILL kullanırsınız. Bunun yerine genellikle kill (1)komutu kullanarak ve gönderilecek sinyali belirtildiği gibi gönderirsiniz.

    $ kill -9 <process ID>
    

    veya anımsatıcı olarak

    $ kill -KILL <process ID>
    

    Bu sinyal işletim sistemi tarafından doğrudan ele alınır ve program olabilir değil varsayılan davranışı geçersiz kılar.

  4. Kabuğunuz iş kontrolünü killdestekliyorsa %, podyum cevabındaki karakteri kullanarak iş tanımlamayı destekleyen yerleşik bir sürümünü de destekleyebilir .

  5. Bir işlemi özgeçmiş olarak duraklatmak için SIGTSTP gönderen Control-z'yi kullanın. fgTerminalin kontrolünü devam ettirmek veya terminali kontrol etmedenbg çalışmasını ayarlamak için böyle bir işleme devam edersiniz (ancak varsayılan olarak çıktısını hala oraya gönderirsiniz).

Ayrıca, SIGQUIT'in damping çekirdeği birçok idari ayrıntıya bağlıdır. Ulimit -c, Solaris vb. üzerinde coreadm (1M).
Tadeusz A. Kadłubowski

1
  1. arka plan süreçlerinin listesini görmek için: jobs

    öldürmek için: kill %1(1'i jobsçıktıdaki karşılık gelen iş kimliğiyle değiştirin )

  2. buraya bakın

1

Ctrl-C, varsayılan olarak bir işlemin sona ermesine neden olan, ancak yakalanabilen (kullanılarak \bin sh, trap) SIGINT gönderir .

SIGKILL durdurulamaz öldürme sinyalidir.

Düzenleme Üçüncü kez, bunun doğru olduğunu düşünüyorum: Belgelere karşı her şeyi kontrol ettim. Göreceğiz.


SIGKILL yakalanamaz.

Evet. Bunu zaten düzelttim ...
Charles Stewart

1

Bu, çoğu terminal yeniliği için açık değildir, ancak sorununuz sadece interaktif bir programdaysanız ve nasıl qçıkacağınızı anlayamıyorsanız , oldukça sık çıkacaktır. Örneğin, bu, çıkmanın anahtarıdır less, bu da mandiğer şeylerin yanı sıra sayfaları görüntülediğinizde aldığınız programdır .

Bazı programlardan çıkmak için başka klavye kısayolları vardır. İçinde vimveya vi, kullanın ESC:wq. İçinde emacs, kullanın Control-C Control-X. İçinde nanoveya pico, kullanın Control-X. Bu örneklerde, özellikle, bu kısayolların düzenlediğiniz dosyada yapmış olabileceğiniz değişiklikleri kaydedip kaydetmediğiyle ilgili inceliklerin olduğunu unutmayın.


Peki standart nedir?
Pacerier

0

Birçok işlem, kesme sinyalini yakalamak için bir kesme işleyicisi yükleyebilir, ancak varsayılan olarak iptal edilmeyecek olanları yükleyebilir.

Bir işlemi bırakmaya zorlamak için SIGQUIT (Ctrl- \) gönderebilirsiniz.


SIGQUIT sıkışabilir, SIGKILL olamaz.
Charles Stewart

1
@Charles: bir başka fark, SIGQUIT'in çekirdeği varsayılan olarak döker, SIGKILL'in yapmamasıdır.
Tadeusz A. Kadłubowski

0

Diğer cevaplar olası senaryo gibi görünüyor, ancak çocuklarını doğru işlemeyen bir komut dosyası çalıştırmanız da mümkündür. Kısa bir süre önce, bir senaryoyu öldürmenin o senaryonun alt süreçlerini öldürmeyeceği benzer bir senaryoyu vurdum.

Genel olarak, bu duruma girerseniz, çalıştırdığınız tüm işlemleri gözden geçirmeniz gerekir. Ps için man sayfasını gözden geçirmelisiniz. ( man ps) Özellikle ps auxwfsüreçler arasındaki ebeveyn / çocuk ilişkisini gösteren kullanmayı seviyorum . pstreebenzer bir şey yapar. Normal durumda işlerin nasıl göründüğünü görmek ve alt süreçleri tanımlamak için süreci öldürmeden önce bunu başka bir terminalden çalıştırmalısınız .

Daha sonra o ana işlemi öldürürseniz (^ C ile), bir şeyin değişip değişmediğini görmek için ps çıkışını tekrar kontrol edin. Alt süreçler hala ortadaysa, bunları killkomutla öldürebilirsiniz . (bakınız man kill)

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.