“Güzel” bash işlemlerini durdurun


4

Kaçınmaya çalışıyorum kill -9 açıklanan nedenlerle Kill -9 form mektubunun yararsız kullanımı . Bu işlev yeterli mi, yoksa beni öldürmem mi gerekiyor? kill zaman aşımından sonra işlemler veya başka inceliklere dikkat etmek mi istiyorsunuz?

soft_kill()
{
    # Try to avoid forcing a kill
    # @param $1: PID
    kill $1 || kill -INT $1 || kill -HUP $1 || \
    (echo "Could not kill $1" >&2; kill -KILL $1)
}

Bir yana, bu fonksiyon için daha iyi bir isim nedir? Şu anki adı bana "Yavaşça Killing Me" hatırlatıyor ve manslaughter biraz şiddetli geliyor. Olabilir spoon_kill (Google'a sor)?

Yanıtlar:


3

Soft_kill'inizin birkaç sorunu var.

  • Bir işlemi öldürmek anlık değildir, ancak sinyal gönderildiği anda öldürmeyi keser. Kill komutunun başarılı olup olmadığını veya -INT veya -HUP'a yükselmeniz gerekip gerekmediğini belirlemeden önce bir süre beklemeniz gerekir.
  • döner öldürmek (1) sinyal göndermesine izin verilirse, sıfır (başarı) Süreci öldürmeyi başarırsa hayır. Yani kodunuzda sadece ilk öldürme işlemi gerçekleştirilecek.

(1)

öldürmek()
DÖNÜŞ DEĞERLERİ
Başarılı olursa, kill () değeri sıfır döndürür. Hata durumunda, -1 değerini döndürür, sinyal göndermez ve errno değerini aşağıdaki değerlerden birine ayarlar:

EINVAL
Sig değeri geçersiz veya desteklenmeyen bir sinyal numarasıdır.

EPERM
Gönderme işleminin kullanıcı kimliği imtiyazlı değildir; gerçek veya etkili kullanıcı kimliği, alma işleminin gerçek veya kaydedilmiş kullanıcı kimliği ile eşleşmiyor. Veya, işlemin herhangi bir alım işlemine sinyal gönderme iznine sahip değildir.

ESRCH
Pid'in belirttiğine karşılık gelen bir süreç veya süreç grubu bulunamıyor.


8
terminate () {
    # accepts PID as $1, defaults to current process
    local signals=(TERM INT QUIT HUP KILL) s=0 process=${1:-$$}
    local signal_qty=${#signals[@]}

    while pgrep $process >/dev/null
    do
        signal=${signals[s]}
        [[ $signal = KILL ]] && echo "Attempting to force kill it." >&2
        kill -$signal $process
        (( ++s >= signal_qty )) && { echo "It won't die." >&2; return 1; }
        sleep 1
    done
}
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.