Bir PID'nin çalışıp çalışmadığını kontrol etmenin uygun bir yolu nedir?


12

Bir .piddosyam var ve işlemin çalışıp çalışmadığını kontrol etmem gerekiyor. Şimdiye kadar iki seçenek buldum

kill -0 `cat something.pid`

pid çalışmazsa bir hata yazdırır. Bunun yeniden yönlendirilebileceğini biliyorum /dev/null, ancak bunun en iyi çözüm olmadığını düşündürüyor.

İkinci çözüm kullanmak olacaktır ps, ancak STDOUT'a da yazdırılır.

ps -ef `cat something.pid`

Çıkışı yeniden yönlendirmek /dev/nullve sadece döndürülen durum kodunu kullanmak normal mi , yoksa yanlış bir şey yaptığımı ve farklı bir komuta ihtiyacım olduğunu gösteren bir işaret mi?


5
kill -0Standart (POSIX) uyumlu olduğu için kullanın .
Anders

Yanıtlar:


10

/ proc / {pid} 'i numaralandıran birçok linux dağıtımında, çalışan işlemler ve genellikle "ps" gibi kullanıcı alanı komutlarının çekirdekle nasıl iletişim kurduğu hakkında bilgi edinmenin iyi bir yoludur. Örneğin;

[ -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

Düzenleme: kpid'in ayarlandığını kontrol etmelisiniz, ancak unset $ {kpid} için "yok" döndüreceği için bu daha kullanışlıdır

[ -n "${kpid}" -a -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

@SteveMuster Bu, yanıtı Linux'a özgü yapar. OSX'te / proc yoktur. Ve bence BSD'de / proc yok.
kül

Bununla birlikte ${kpid}varlığınızdan emin olmanız gerekir
Wilf

@ Düzenlediğimde, ayarlanmamış $ {kpid} için "işlem mevcut değil" döndürüyor
Tom H

Teşekkürler - Benzer bir yöntem kullanarak bir PID kontrol eden bir komut dosyası yapıyordum ve bu sorun olduğunu bulana kadar işe yaramadı :)
Wilf

6

Anders'in belirttiği gibi, kill -0POSIX uyumluluğu için kullanmalısınız .

Linux sistemlerinde, / proc dosya sisteminde bir dosyanın varlığını da kontrol edebilirsiniz, örn.

-f /proc/$(cat something.pid)/status

1

Bu bir komut dosyasında ise (ki stdout'a baskı yapmaktan endişe duyduğunuzu varsayalım) o zaman aşağıdaki nasıl olabilir:

if ps -p $(cat something.pid) > /dev/null 2>&1
then
    kill $(cat something.pid)
else
    # Deal with the fact that the process isn't running
    # i.e. clear up the pid file
fi

ps -pSomething.pid belirtilen PID ile bir işlem için bakır ( $()sözdizimi ters tırnak bir biraz daha yeni versiyonu. Ters tırnak yeni bir form değildir, bazı durumlarda kaçan gerekir). Bu 2>&1komut için stderr'i de yönlendirir.

Eğer ps -pkomut o PID ile süreci bulamazsa bir hata> 0 ile çıkar ve böylece elseçalıştırılmaktadır. Aksi takdirde killifade. İsterseniz yukarıdakileri reddedebilirsiniz:

if ! ps -p ...

Umarım sorunuzu cevaplar. Açıkçası dikkatli olun ve gibi tehlikeli komutları kullanırken çok test edin kill.


1

İşte bazı seçenekler:

  • İnit-script (örneğin, yerleştirilecek olan /etc/init.d/) yazıyorsanız ve Debian tabanlı dağıtım kullanıyorsanız, şunları kullanmanız daha iyi olur start-stop-daemon:
    # start-stop-daemon -T -p $PIDFILE -u $USER_NAME -n $NAME
    Çalışıyorsa çıkış kodu 0'ı almalısınız.
  • Paketten pgrep ve pkill kullanabilirsiniz procps:
    pgrep --pidfile $PIDFILE

0

Pid dosyanız varsa, işlemin çalışıp çalışmadığını kontrol etmek için pgrep kullanabilirsiniz:

    if pgrep -F something.pid; then
        echo "Running"
    else
        echo "Not running"
    fi
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.