Bir işlemin çalışıp çalışmadığını belirlemek için .pid dosyaları güvenilir midir?


11

Sshd gibi birçok program, / var / run / dizininde işlem kimliklerini içeren .pid dosyaları oluşturur. Bu dosyalar bir işlemin çalışıp çalışmadığını belirlemek için güvenilir midir? Benim tahminim, bu dosyalar bir işlem tarafından elle oluşturulur ve bu nedenle program çökerse hala dosya sisteminde kalacaktır.

Yanıtlar:


16

basit bir ifadeyle, hayır : bir işlem (örn. bir daemon) çökebilir ve .pid dosyasını temizleme zamanı yoktur.

Bir programın durumundan daha emin olmak için bir teknik: soket gibi açık bir iletişim kanalı kullanın. Soket bağlantı noktasını bir dosyaya yazın ve supervisorişlemin bakmasını sağlayın.

Linux'ta DBus hizmetlerini de kullanabilirsiniz: belirli bir ad kaydettirin ve süpervizör işleminizin (ne derseniz deyin) o adı kontrol etmesini isteyin.

Çok sayıda teknik var.

Hatırlanması gereken bir şey: PID dosyalarını yönetmek OS'nin sorumluluğu değildir.


1
Ancak sürecin varlığı ile KOMBİNE EDİLEN pid dosyasının varlığı yeterli olmalıdır. İşlem kesilirse, bunu kontrol edebilirsiniz. PID'ler tekrar kullanılır, ancak çok sık değildir.
MarkR

2
bir pid'in ne sıklıkta yeniden kullanıldığı söz konusu sisteme bağlıdır. Bir sistemin en azından günlük olarak PID'ler olduğunu gördüm. Pid'i kontrol etmelisiniz, bir süreç olduğunu ve sürecin pideye sahip olmayı beklediğiniz gibi görünmesini sağlamalısınız.

@ atk: kesinlikle. Standart bir standart yoktur ve bir tane olsa bile, bazı uygulamalar tarafından çok iyi sayılmayabilir. Örneğin, hiç bir PID dosyası yazmayan bir daemon oluşturabilir ve yönetim komutlarını almak için bir arka kanal kullanabilirim.
jldupont

@atk: ne yazık ki, PID'nin kontrol zamanı ve kullanım süresi arasında yeniden kullanılmamasını sağlamanın bir yolu yok ...
SamB

3

Jldupont, bir çökme durumunda dosya kaldırılamayabileceğinden , .pid dosyalarının bir işlemin çalışıp çalışmadığını belirlemek için güvenilir olmadığını belirten doğrudur .

Yarış koşulları bir yana, genellikle bir sürecin çalışıp çalışmadığını bilmem gerektiğinde pgrep kullanıyorum . Sonra gerekli hissettim .pid dosya (lar) karşı çıktı çapraz başvuru olabilir.


3

İşlem kimliği içeren bir dosya güvenilir değil, bir işlemin çalışıp çalışmadığını belirleyin. İşlem için verilen son işlem kimliğini bulmak yalnızca güvenilir bir kaynaktır.

İşlem kimliğine sahip olduğunuzda, işlem gerçekten çalışıyorsa daha fazla denetim yapmanız gerekir.

İşte bir örnek:

#!/usr/bin/env sh

file="/var/run/sshd.pid"
processid=$(cat /var/run/sshd.pid)

if [ ! -f ${file} ]; then
    echo "File does not exists: ${file}"
    exit 1
fi

if [ ! -r ${file} ]; then
    echo "Insufficient file persmissons: ${file}"
    exit 1
fi

psoutput=$(ps -p ${processid} -o comm=)

if [ $? == 0 ];then
    if [ ${psoutput} == "sshd" ]; then
        echo "sshd process is realy running with process id ${processid}"
        exit 0
    else
        echo "given process id ${processid} is not sshd: ${psoutput}"
        exit 1
    fi
else
    echo "there is no process runing with process id ${processid}"
    exit 0
fi

pgrep güzel bir komuttur, ancak çalışan birden çok örneğiniz olduğunda sorun yaşarsınız. Örneğin liman TCP / 22 çalışan düzenli bir sshd varsa ve ararken TCP / 2222, o zaman pgrep iki süreç kimlikleri teslim edecek bağlantı noktasında çalışan başka sshd olduğunda sshd Normal sshd içinde / var olan pid varken ... /run/sshd.pid ve diğeri /var/run/sshd-other.pid içindeki pid'e sahip olabilir ve işlemleri açıkça ayırt edebilirsiniz.

Ben yok sadece kullanmanızı tavsiye ps ile bir veya birden fazla borulardan Borulama grep ve grep -v biraz kullanmak gibi ... ilgini çekmiyor tüm diğer şeyler filtre çalışıyor

find . | grep myfile

bir dosya çıkarsa bunu anlamak için.


2

Dosyada bulunan pid ile aynı işlemin varlığını kontrol etmek güvenilir değildir.

Ancak birçok pidfile uygulaması da pidfile üzerinde kilitleme yapar, böylece işlem ölürse kilit kaybolur. Kilitleme mekanizmasının güvenilir olması şartıyla, dosyanın hala kilitli olup olmadığını kontrol etmek, orijinal sürecin hala çalışıp çalışmadığını belirlemek için nispeten güvenilir bir mekanizmadır.


1

Jldupont doğru.

Bununla birlikte, sürecin hala hayatta olup olmadığını görmek için sürece bir 0 sinyali (kill -s 0 pid) gönderebilirsiniz (böyle bir sinyal gönderme yetkiniz olduğunu varsayarsak - genel olarak, yalnızca bir işlemin sahibi gönderebilir bir sinyal).


4
Ancak bu PID ile bir sürecin varlığını kontrol etmek, bunun ilgilendiğiniz PID olduğu anlamına gelmez.
janm

0

Jschmier'e katılıyorum.

Bazı sistemlerde pgrep'e erişemezsiniz. Böyle bir durumda, ps -aef | grep <pid>sürecin gerçekten çalışıp çalışmadığını öğrenmek için yapabilirsiniz .


1
Sorunun kilit noktası "güvenilir" idi. Bir ps yapmak ve bir PID aramak güvenilir değildir.
janm

iyi ... programın adını bildiğinizi varsayarsak, neden ps -aef | grep güvenilmez mi?
user29584

3
Yarış koşulları: Sistemin durumu ps tamamlandığında değişti. İşlem başlıkları: başka bir işlem ilgilendiğinize benzer bir başlığa sahip olabilir. Birden çok örnek: Her biri PID dosyası olan aynı hizmetin iki örneğine sahip bir sistem düşünün. Biri başarısız olur ve diğeri yeniden başlatılır ve ilk hizmetin PID'sini alır. Nasıl söylersin? Vb. Güvenilir değil, yarış koşulları nedeniyle doğru almak imkansız ve sadece çalışan güvenilir teknikler vardır. Güvenilir bir alternatif için bkz. Örneğin, cr.yp.to/daemontools.html
janm
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.