Yanıtlar:
Bir sürecin varlığını kontrol etmek için şunu kullanın:
kill -0 $pid
Ama @unwind'in söylediği gibi, yine de öldüreceksen,
kill $pid
ya da bir yarış durumunuz olacak.
Metin çıkışını yok saymak kill
ve çıkış koduna göre bir şey yapmak istiyorsanız,
if ! kill $pid > /dev/null 2>&1; then
echo "Could not send SIGTERM to process $pid" >&2
fi
kill
sürecin öldürülmesi gerekmediği için biraz yanlış adlandırılmıştır. Sadece sürece bir sinyal gönderir. sona erdirmek için bir talimat olan SIGTERM sinyalini işleme gönderen 15'e kill $PID
eşdeğerdir kill -15 $PID
. Bir sinyal 0 yoktur, bu kill
sadece sürece bir sinyalin gönderilip gönderilemeyeceğini kontrol etmeyi söyleyen özel bir değerdir ; Bkz. Linux.die.net/man/2/kill ve linux.die.net/man/7/signal
kill -0
, aslında, bunu yapmak zorundayım: kill -0 25667 ; echo $?
- ve sonra bir 0
iade alırsam, bu PID ile süreç öldürülebilir; Proses PID (diyelim) yoksa ve, $?
olacak 1
bir arıza olduğunu belirten. Bu doğru mu?
En iyi yol:
if ps -p $PID > /dev/null
then
echo "$PID is running"
# Do something knowing the pid exists, i.e. the process with $PID is running
fi
Sorun:
kill -0 $PID
pid çalışıyor olsa ve onu öldürme izniniz olmasa bile çıkış kodunun sıfır olmamasıdır. Örneğin:
kill -0 1
ve
kill -0 $non-running-pid
normal bir kullanıcı için ayırt edilemeyen (sıfır olmayan) bir çıkış koduna sahip olmakla birlikte, başlatma işlemi (PID 1) kesinlikle çalışıyor.
Testin gövdesi bir "öldürme" ise, öldürme ve yarış koşullarını tartışan cevaplar kesinlikle doğrudur. " Bash'da bir PID varlığını nasıl test edersiniz " genelini aramaya geldim .
/ Proc yöntemi ilginçtir, ancak bir anlamda "ps" komut soyutlamasının ruhunu kırar, yani / proc'a gitmenize gerek yoktur çünkü Linus "exe" dosyasını başka bir şey olarak adlandırmaya karar verirse ne olur?
-p
en azından bu durumda gereksizdir. ps $PID
aynı sonucu verir.
if [ -n "$PID" -a -e /proc/$PID ]; then
echo "process exists"
fi
veya
if [ -n "$(ps -p $PID -o pid=)" ]
İkinci formda, -o pid=
yalnızca üst bilgisi olmayan işlem kimliği sütununu görüntülemek için bir çıktı biçimidir. Tırnaklar boş olmayan dize operatörünün geçerli sonuç vermesi için gereklidir-n
.
if ps -p"$PID" -o "pid=" >/dev/null 2>&1; then echo "Process is running..."; fi
ps
seçenekler ve özellikler platformlar arasında değişiklik gösterme eğilimindedir, bu yüzden hala tamamen taşınabilir değildir.
$PID
boşsa dizin hala var olduğundan hala [ -e /proc/$PID ]
true değerini döndürür /proc/
.
İki yolunuz var:
Dizüstü bilgisayarımda belirli bir uygulamayı arayarak başlayalım:
[root@pinky:~]# ps fax | grep mozilla
3358 ? S 0:00 \_ /bin/sh /usr/lib/firefox-3.5/run-mozilla.sh /usr/lib/firefox-3.5/firefox
16198 pts/2 S+ 0:00 \_ grep mozilla
Tüm örnekler şimdi PID 3358'i arayacaktır.
Birinci yol : İkinci sütunda PID için "ps aux" ve grep komutunu çalıştırın. Bu örnekte firefox'u ve ardından PID'sini arıyorum:
[root@pinky:~]# ps aux | awk '{print $2 }' | grep 3358
3358
Yani kodunuz:
if [ ps aux | awk '{print $2 }' | grep -q $PID 2> /dev/null ]; then
kill $PID
fi
İkinci yol : Sadece /proc/$PID
dizinde bir şey arayın . Bu örnekte "exe" kullanıyorum, ancak başka bir şey kullanabilirsiniz.
[root@pinky:~]# ls -l /proc/3358/exe
lrwxrwxrwx. 1 elcuco elcuco 0 2010-06-15 12:33 /proc/3358/exe -> /bin/bash
Yani kodunuz:
if [ -f /proc/$PID/exe ]; then
kill $PID
fi
BTW: sorun kill -9 $PID || true
nedir?
DÜZENLE:
Birkaç ay boyunca düşündükten sonra .. (yaklaşık 24 ...) burada verdiğim orijinal fikir güzel bir hack, ama son derece dayanılmaz. Linux'un birkaç uygulama ayrıntısını öğretirken, Mac, Solaris veya * BSD üzerinde çalışmaz. Hatta gelecekteki Linux çekirdeklerinde bile başarısız olabilir. Lütfen - diğer yanıtlarda açıklandığı gibi "ps" kullanın.
/proc/$PID/exe
normal bir dosya değil. Yani, [ -f /proc/$PID/exe ]
her zaman bir false
sonuç döndürür . Deneyin [ -h /proc/$PID/exe ]
.
İstediğin gibi görünüyor
wait $PID
$pid
bittiğinde geri döner .
Aksi takdirde kullanabilirsiniz
ps -p $PID
Sürecin hala hayatta olup olmadığını kontrol etmek için (bu, kill -0 $pid
pid'e sahip olmasanız bile çalışacağından daha etkilidir ).
pid 123 is not a child of this shell
Bence bu yarış koşullarına açılan kötü bir çözüm. İşlem testinizle öldürme çağrınız arasında ölürse ne olur? Sonra öldürme başarısız olur. Öyleyse neden her durumda öldürmeyi denemiyorsunuz ve nasıl gittiğini öğrenmek için dönüş değerini kontrol etmiyorsunuz?
kill -9
. Bu, işlemi anında öldürür ve kendi kendini temizleme şansı vermez. Bunun yerine buna kill
eşdeğer kullanın kill -15
. Bu işe yaramazsa, nedenini ve sadece son çare kullanımı olarak öğrenmelisiniz kill -9
.
Burada PID .pid adlı bir dosyada saklar (bu tür / run / ... gibi) ve sadece yürütülmüyorsa sadece komut dosyası yürütmek.
#!/bin/bash
if [ -f .pid ]; then
read pid < .pid
echo $pid
ps -p $pid > /dev/null
r=$?
if [ $r -eq 0 ]; then
echo "$pid is currently running, not executing $0 twice, exiting now..."
exit 1
fi
fi
echo $$ > .pid
# do things here
rm .pid
not: pid'in nasıl çağrıldığını kontrol etmediği için bir yarış koşulu vardır. sistem yeniden başlatılırsa ve .pid mevcutsa ancak farklı bir uygulama tarafından kullanılıyorsa, bu 'öngörülemeyen sonuçlara' yol açabilir.
Örneğin GNU / Linux'ta şunları kullanabilirsiniz:
Pid=$(pidof `process_name`)
if [ $Pid > 0 ]; then
do something
else
do something
fi
Veya benzeri bir şey
Pin=$(ps -A | grep name | awk 'print $4}')
echo $PIN
ve bu size uygulamanın adını, yalnızca kimliği olmayan adı gösterir.
pidof
negatif bir PID herhangi bir anlam ifade etmediği ve öldüremeyeceğiniz için negatif bir sayı döndürmez init
, bu nedenle koşulunuz mantıklı değildir (ve ayrıca, >
yeniden yönlendirme yapmasını önlemek için de kaçmanız gerekir ). Boş bir sonuç olup olmadığını kontrol etmek istersiniz, ancak elbette, iyi bir araç gibi, pidof
işe yarayıp yaramadığını söylemek için bir çıkış kodu ayarlar, böylece uygun çözüm if Pid=$(pidof 'process_name'); then ...
ya da ( Pid
daha sonra değere ihtiyacınız yoksa ) basitçeif pidof 'process_name'; then...
pidof
örnek bash nasıl test
çalışır hakkında yanlış anlamalarla dolu bir örnektir . gnu.org/software/bash/manual/html_node/…
Aşağıdaki kod, işlemimin çalışıp çalışmadığını kontrol eder, öyleyse hiçbir şey yapmaz.
Amazon SQS'dan yeni iletileri yalnızca saatte bir ve yalnızca işlem çalışmıyorsa kontrol edelim.
#!/bin/bash
PID=$(ps aux | grep '/usr/bin/python2.7 manage.py SES__boto3_sqs_read' | grep -v grep | awk '{print $2}')
if [[ -z $PID ]]; then
/usr/bin/python2.7 /home/brian/djcode/proyectoONE/manage.py SES__boto3_sqs_read
else
echo "do nothing, just smile =)"
fi
exit $?