Yanıtlar:
0
verilen bir sinyalin gönderilmesi, verilen PID
ile 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.
...
man 2 kill
bunun yerine kullanın.
man 1 kill
ve man 2 kill
benim Fedora 20 sistemde vardı. Her iki sayfada da gömülü olmak zor.
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
man 2 kill
... 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.
Debian ve Ubuntu sistemlerinde, çıktıları man 2 kill
kı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.
kill -0
Bir 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 -0
Geç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: $?"
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.
kill
Man sayfasına gömülür : "sig 0 ise, sinyal gönderilmez, ancak hata kontrolü hala yapılır."
Bu komut, $ pid içinde PID ile işlemin canlı olup olmadığını kontrol eder.
$pid
çalışıyor olabilir, ancak ona bir sinyal gönderme izniniz yok.
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 -0
her 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).
kill -0 $pid
her iki durumda da aynı olmayacaktır. Bu dönecektir 1
Eğer çıktıya ayrıştırma olmadan söyleyemem böylece kill
bunu 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
kill
bash 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].
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ü
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)
Zombi süreci durumunda, çocuğun ebeveynin beklemesini beklemesi. Burada $ pid tutar ve bu süreç çalışmazken olumlu sonuç verir.
$ 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.
EXIT
Sinyali veya 0
bir sürece gönderme :stdout
Başarı üzerine herhangi bir çıktı göndermez .stderr
Doğru olmayan bir şeye hata mesajı gönderin .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-headers
anahtarla 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 $?
}