PID toplamak için günlük dosyalarını ayrıştıran ve daha sonra bu PID çalışıp çalışmadığını denetler Perl komut dosyası yazıyorum. Bu kontrolü yapmanın en iyi yolunu düşünmeye çalışıyorum. Açıkçası, şöyle bir şey yapabilirim:
system("ps $pid > /dev/null") && print "Not running\n";
Ancak, mümkünse sistem çağrısından kaçınmayı tercih ederim. Bu nedenle /proc
dosya sistemini kullanabileceğimi düşündüm (taşınabilirlik bir endişe değildir, bu her zaman bir Linux sisteminde çalışacaktır). Örneğin:
if(! -d "/proc/$pid"){
print "Not running\n";
}
Bu güvenli mi? Herhangi bir /proc/$pid/
dizin yoksa ilişkili PID'nin çalışmadığını her zaman kabul edebilir miyim ? AFAIK'in ps
kendisini /proc
zaten bilgilerini aldığı için bekliyorum ama bu üretim kodu için olduğundan emin olmak istiyorum.
Peki, çalışan bir işlemin dizini olmadığı /proc/PID
veya bir /proc/PID
dizinin bulunduğu ve işlemin çalışmadığı durumlar olabilir mi? ps
Dizinin varlığını denetlemeyi tercih etmenin herhangi bir nedeni var mı ?
kill -0
en iyisi), bunun yalnızca belirtilen PID'de çalışan bir işlem olup olmadığını gösterir . Sürecin hala bir milisaniye sonra çalışıp çalışmayacağını söylemez ve işlemin ilgilendiğiniz işlem olup olmadığını veya ilginç işlem öldükten sonra aynı PID'yi atanmış ilişkisiz bir işlem olup olmadığını söylemez. . Belirli bir PID'nin çalışıp çalışmadığını test etmek neredeyse her zaman bir hatadır : bunun yarış koşullarına eğilimli olmadığı çok az koşul vardır.
kill
0 sinyali kullanan perl işlevi vardır, bu da öldürme yapmaz, ancak bunu yapıp yapamayacağınızı söyler (yani bu işlemi sinyal almak için izne ihtiyacınız vardır).