Bir süreci iyi için sonlandırmaya çalıştığınızda, “öldürme” için hangi seçeneği kullanmalısınız?


26

İnsanlardan çok karışık mesajlar alıyorum ve kullandığınız şeyde gerçekten çok fazla bir fark olup olmadığını merak ediyorum.

kill 'x'
killall 'x'
kill -9 'x'

Bunlar şimdiye kadar kullanmamın söylendiği bazı seçeneklerdir, ancak bazı insanlar öldürmenin -9 'un çok fazla abartı olduğunu, tek başına öldürmenin işe yaramadığını vb.

Sadece bir süreci sonlandırmak için en standart durumda hangisinin kullanılması gerektiği konusunda herhangi bir tavsiyesi olan var mı?

[edit] Baştan beri yeni bir tane daha çalıştırabilmeniz için işleminizin yürütülmesini durdurmak istediğinizde ne kullanacağınızı arıyorum.


1
Ayrıca, kötüye kullanıma karşı uyarıcı UUK9 form mektubuna bakınız SIGKILL.
jw013,

1
Tüm farklı sinyalleri, numaralarıyla birlikte listelemek için: kill -lve bir sayıyı karşılık gelen sinyal adına çevirmek, örneğin kill -l 9, geri dönecektir KILL.

Yanıtlar:


24

Varsayılan konumlandırma işlemi sonlandırmak olan bir dizi sinyal vardır. Nihai sonlandırma sinyali SIGKILL'tir, çünkü idare edilemez ve sürecin ölmekten başka seçeneği yoktur. Bununla birlikte, bu aynı zamanda, eğer gönderirseniz, sürecin temizlik fırsatından mahrum kaldığı anlamına gelir. Bu nedenle, iyi görgü ilk önce SIGTERM gibi bir sinyal göndermeyi gerektirir ve yalnızca işlem bir süre sonra çıkmazsa SIGKILL gönderir.

SIGINT ve SIGQUIT’in keyfi işlem sonlandırma için iyi bir aday olmadığını unutmayın. Terminalin klavyesinden üretilebilmeleri nedeniyle, birçok uygulama bunları özel amaçlar için kullanır. Örneğin, python yorumlayıcısı KeyboardInterruptistisna oluşturmak için SIGINT kullanır (aynı zamanda istemine geri döndüğü etkileşimli python oturumlarında) ve JVM yığın izlerini dökmek için SIGQUIT kullanır. SIGINT ve SIGQUIT findya da gibi birçok standart komut satırı yardımcı programı için etkin kalır cat.

Sistem kapatılırken, çoğu UNIX ve Linux sistemi SIGTERM'i tüm işlemlere gönderir, ardından 5 saniye bekler, ardından SIGKILL gelir. Bu, keyfi bir işlemi güvenli bir şekilde kapatmanın önerilen yoludur.

Ayrıca SIGKILL'in bile, süreç uyanana kadar kesintisiz bir bekleyişte kalmış bir işlemi sonlandırmayabileceğini unutmayın.


1
Mükemmel cevap kill -SIGTERM $pid; sleep 5; kill -SIGKILL $pid;Tavsiye için referansınız var mı?
l0b0

+1 tür cevap. Peki ya SIGHUP?
Alois Mahdal,

2
@ AloisMahdal: SIGHUPçevirmeli hatların yaygın olduğu günden itibaren. Bu sinyal, hattın kapatıldığını belirtmek için gönderildi. Daha sonra, bu daha az yaygın olduğunda SIGHUP, bazen servis işlemleri tarafından yeniden başlatmadan config dosyasını yeniden okumak için daemon'lar tarafından kullanılır. Bu modern zamanlarda SIGHUPnadiren kullanılır. Pek çok daemonun kendine göre yeniden başlatma yolu vardır (örneğin, apachectl gracefulveya rndc reconfig. [init.d|smf|upstart|launchd]
Yapmadığınız

13

En kibar olanla başlamalı ve oradan yükselmelisin. Bu, SIGINT, SIGTERM, SIGQUIT, SIGKILL anlamına gelir. Her ne kadar çoğu insan SIGINT ve SIGQUIT atlarlar.


Ek olarak, bazı uygulamalar (JDK gibi) SIGQUIT'i farklı şekilde ele alır. Muhtemelen belirli bir uygulamanın onu nasıl idare ettiğini bilmeden SIGQUIT'i kullanmam.
dimo414
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.