Birincisi, bu bash'a özgü değil. ATT ksh, tire ve zsh aynı şekilde davranırlar: komut satırı sürümü sırasında SIGTERM ve SIGQUIT'i yok sayarlar; mksh gelince, aynı zamanda bırakmaz ama onlara SIGINT gibi davranır.
Hem ksh kılavuzu hem de bash kılavuzu, SIGTERM'i görmezden gelmeyi şu koşullarda haklı çıkarır:
böylece kill 0
interaktif bir kabuğu öldürmez
kill 0
işlem grubundaki kabuğun bulunduğu tüm işlemleri öldürür . Özetle, süreç grubu bir terminalde ön planda çalışan tüm süreçlerden veya bir arka plandaki veya askıya alınmış bir işteki tüm süreçlerden oluşur.
Daha doğrusu, iş kontrolü ile modern kabuklarda olan budur . Bu tür kabuklarda, kill 0
kabuk kendi başına bir süreç grubunda olacağı için yararlı olmaz. Eski kabuklar (ya da sonrasındaki modern kabuklar set +m
) arka plan komutları için işlem grupları oluşturmadı. Bu yüzden, kill 0
oturumu kapatmadan tüm arka plan komutlarını öldürmek için komutu kullanabilirsiniz kill 0
.
Bununla birlikte, kabuğun bağışıklığının faydalı olduğu başka benzer durumlar da vardır. Bir terminali gezdiren işlemlerinizin olduğu ve oturumu kapatmadan öldürmek istediğiniz durumu düşünün. Birçok sistem pkill
, bir terminalde çalışan işlemleri öldürmenize izin veren bir araca sahiptir. Sinyali yoksayan kabuk hariç, geçerli terminalde çalışan tüm işlemleri çalıştırabilir pkill -t $TTY
veya pkill -QUIT -t $TTY
öldürebilirsiniz.
Bir kabuk normalde kullanıcı onu terk ettiğinde ( exit
ya da gibi bir komutla logout
) ya da terminali girişin sonunu gösterdiğinde (kullanıcı Ctrl+ tuşuna basarak buna neden olabilir D) ya da tamamen ortadan kalkar. Bu son durumda, kabuk SIGHUP sinyalini alır ve bunu görmezden gelmez.
Bir X oturumundan çıkış kill -15 -1
yapma durumunuz için bunu yapar, çünkü kabuğun SIGHUP almasına neden olan terminal öykünücüsünü öldürür. Aslında X sunucusunu öldürmek yeterlidir, ancak bu işlem işlem kimliğini bulmayı gerektirir. Aynı komutun bir metin oturumunda çalışmasını istiyorsanız, kullanabilirsiniz kill -15 -1; exit
. Zaten parmaklarınızın ucunda olması oldukça tehlikeli bir komut.
¹ Bu kural olarak kabuk kılavuzları belirtilmelidir görünmüyor; temel sistem çağrısının bir özelliğidir. POSIX spesifikasyonunda açıkça belirtilmiştir .
² Günümüzde bunu yapmak için, jobs -l
süreç grubu kimliğine sahip işlerin listesini görmek, ardından kill -123 -456 …
işlem gruplarını öldürmek için çalıştırın.
/bin/kill
ya da kabuk yerleşimi? İkincisi, kabuğun kendi yerleşimi ile kendini öldürmeyeceğini tahmin ediyorum.