Bir kabuk betiğinde "kill -0 $ pid" ne yapar?


Yanıtlar:


136

0verilen bir sinyalin gönderilmesi, verilen PIDile herhangi bir işlemin PIDçalışıp çalışmadığını kontrol eder ve ona bir sinyal gönderme izniniz vardır.

Daha fazla bilgi için aşağıdaki sayfalara bakın:

öldürmek (1)
$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
öldürmek (2)
$ man 2 kill
...
If sig is 0, then no signal is sent, but error checking is still performed; this 
can be used to check for the existence of a process ID or process group ID.
...

7
Bu bilginin yeri (eğer varsa) büyük ölçüde sisteme bağlıdır. Son Debian tabanlı sistemlerde man 2 killbunun yerine kullanın.
Todd A. Jacobs

2
Hem man 1 killve man 2 killbenim Fedora 20 sistemde vardı. Her iki sayfada da gömülü olmak zor.
slm

Veya bunun yerine posix kılavuzuna If sig is 0 (the null signal), error checking is performed but no signal is actually sent. The null signal can be used to check the validity of pid. güvenin
Thomas Hughes

2
man 2 kill
Komutanın

126

Bu Güzel Bir Soru Çünkü ...

... bu özel sinyalle ilgili doküman bulmak zor olabilir. Diğerlerinin söylediklerine rağmen man 1 kill, Debian tabanlı sistemlerde bu sinyalin tek sözü :

Özellikle yararlı sinyaller arasında HUP, INT, KILL, STOP, CONT ve 0 bulunur.

Özellikle sinyalin ne yaptığını bilmiyorsanız, özellikle yararlı değil. Ayrıca çıktısıyla listelenmez kill -l, bu yüzden zaten bilmediğiniz sürece bunu bilmezsiniz.

Nerede Belgelenir Bulunur

Debian ve Ubuntu sistemlerinde, çıktıları man 2 killkısmen şöyle diyor:

Sig 0 ise, sinyal gönderilmez, ancak yine de hata kontrolü yapılır; bu, işlem kimliğinin veya işlem grubu kimliğinin varlığını denetlemek için kullanılabilir.

Ne İçin İyi?

kill -0Bir işlemin çalışıp çalışmadığını kontrol etmek için kullanabilirsiniz . Bu örnekleri ele alalım.

# Kill the process if it exists and accepts signals from
# the current user.
sleep 60 &
pid=$!
kill -0 $pid && kill $pid

# Check if a PID exists. When missing, this should result
# in output similar to:
#    bash: kill: (6228) - No such process
#    Exit status: 1
kill -0 $pid; echo "Exit status: $?"

kill -0Geçerli kullanıcının belirli bir işlemi işaretleme izinlerine sahip olup olmadığını belirlemek için de kullanabilirsiniz . Örneğin:

# See if you have permission to signal the process. If not,
# this should result in output similar to:
#     bash: kill: (15764) - Operation not permitted
#     Exit status: 1
sudo sleep 60 &
kill -0 $!; echo "Exit status: $?"

Mac ve kill(2)The kill() function sends the signal specified by sig to pid, a process or a group of processes. Typically, Sig will be one of the signals specified in sigaction(2). A value of 0, however, will cause error checking to be performed (with no signal being sent). This can be used to check the validity of pid.
BSD'de

8
Bu kabul edilen cevap olmalı. Diğerinden çok daha iyi. 0 sinyalindeki dokümantasyonun bulunması zordur. killMan sayfasına gömülür : "sig 0 ise, sinyal gönderilmez, ancak hata kontrolü hala yapılır."
slm

6

Bu komut, $ pid içinde PID ile işlemin canlı olup olmadığını kontrol eder.


1
Man sayfası şöyle diyor: "sig 0 ise, sinyal gönderilmez, ancak yine de hata kontrolü yapılır." Burada hangi hata kontrolünden bahsediyoruz?
gjain

2
-1, çünkü PID ile bir işlem $pidçalışıyor olabilir, ancak ona bir sinyal gönderme izniniz yok.
dwalter

2
@dwalter: İzniniz yoksa bir EPERM alacaksınız. Eğer mevcut değilse, bir ESRCH alırsınız. kill(1)Her biri için farklı bir hata yazdırılır. Böylece, sinyal gönderme izniniz olup olmadığına bakılmaksızın pid'in canlı olup olmadığını anlayabilirsiniz. Ayrıca, tipik kullanımı, kill -0her zaman doğru kullanılmasa bile pid'in canlı olup olmadığını görmektir. Bu cevabın doğru olduğunu söyleyebilirim (imla dışında).
camh

3
@camh: hiçbir dönüş değeri kill -0 $pidher iki durumda da aynı olmayacaktır. Bu dönecektir 1Eğer çıktıya ayrıştırma olmadan söyleyemem böylece killbunu bir sinyal gönderme izni yoksa süreç, koşma ya değilse. DÜZENLEME: evet biliyorum çoğu zaman bir sürecin canlı olup olmadığını kontrol etmek için kullanılır, ancak sinyali gönderme izniniz olduğunu garanti
edemezseniz bu yanlıştır

2
@dwalter: Demek istediğim, cevabın doğru olmasıydı. Bilgiçlik taslamaya çalıştınız ve başka bir hata durumu olduğunu belirtiyorsunuz, ancak size teknik olarak cevabın, killbash yerleşik (soru etiketli bash) stderr ve gösterge üzerindeki hata türünü çıkardığı için bu durumu da kapsadığını söylüyorum dönüş kodundaki bir hata. Yani, çıktıyı doğru yorumladığınızda "Bu komut $ pid'de PID ile işlemin canlı olup olmadığını kontrol eder" tamamen doğrudur. [Cevaba -1 verdiğinizi söylemediyseniz yorum yapmazdım. Yorumunuz başka şekilde geçerlidir].
camh

6

Kill -0 $ pid, pid ile işlemin mevcut olup olmadığını kontrol etmektir.

İşlemin varlığını kontrol etmek için 'kill -0 $ pid' kullanırken dikkatli olun çünkü

  1. Amaçlanan işlemden çıktıktan sonra pid'i yeni oluşturulan diğer işleme ayrılabilir. (Yani belirli bir sürecin canlı olduğundan ya da olmadığından o kadar emin olamazsınız)

  2. Zombi süreci durumunda, çocuğun ebeveynin beklemesini beklemesi. Burada $ pid tutar ve bu süreç çalışmazken olumlu sonuç verir.


1

$ Pid ile çalışan bir işlemin canlı olup olmadığını kontrol etmek için kullanılan -0 $ pid'i öldür. Ancak, işlem çıkışı ve yeni işlem çalıştıktan sonra işlem kimliği yeniden atanabildiğinden bu zor olabilir. Belirli bir işlemin çalışıp çalışmadığını öğrenmek için killall -0 kullanılabilir.


0

EXITSinyali veya 0bir sürece gönderme :

  1. Bir sürecin varlığını kontrol edin.
  2. İşlemde çeşitli hata kontrolü yapın (PID, PGID, vb ...).
  3. stdoutBaşarı üzerine herhangi bir çıktı göndermez .
  4. stderrDoğru olmayan bir şeye hata mesajı gönderin .
  5. İşlem geçersizse (yani Zombi) size yanlış bir pozitif verin.

Daha açık bir şekilde, kabuk komut dosyalarınız için kullanışlı bir işlev:

function isProcess ()
{
    kill -s EXIT $1 2> /dev/null
}

Bu stdout, başarı üzerine hiçbir metin döndürür , ancak başarısızlık üzerine bir hata iletisi stderr(ancak bu hata iletisini yeniden yönlendirdim /dev/null).

Geçersiz / zombi işlem durumuyla ilgili endişeleriniz varsaps , tercihen --no-headersanahtarla kullanmanız gerekir .

#!/bin/ksh

function trim ()
{
    echo -n "$1" | tr -d [:space:]
}

function getProcessStatus ()
{
    trim $(ps -p $1 -o stat --no-headers)
}

function isZombie ()
{
    typeset processStatus=$(getProcessStatus $1)

    [[ "$processStatus" == "Z" ]]
    return $?
}
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.