मैं एक पर्ल स्क्रिप्ट लिख रहा हूं जो PID को इकट्ठा करने के लिए लॉगफाइल्स को पार्स करता है और फिर जांचता है कि क्या पीआईडी चल रहा है। मैं उस जाँच को करने का सबसे अच्छा तरीका सोचने की कोशिश कर रहा हूँ। जाहिर है, मैं कुछ ऐसा कर सकता था:
system("ps $pid > /dev/null") && print "Not running\n";
हालाँकि, यदि संभव हो तो मैं सिस्टम कॉल से बचना चाहूँगा। इसलिए मैंने सोचा कि मैं /proc
फाइल सिस्टम का उपयोग कर सकता हूं (पोर्टेबिलिटी एक चिंता का विषय नहीं है, यह हमेशा लिनक्स सिस्टम पर चलता रहेगा)। उदाहरण के लिए:
if(! -d "/proc/$pid"){
print "Not running\n";
}
क्या वह सुरक्षित है? क्या मैं हमेशा मान सकता हूं कि अगर कोई /proc/$pid/
निर्देशिका नहीं है तो संबंधित पीआईडी नहीं चल रही है? मुझे उम्मीद है कि चूंकि AFAIK ps
को इसकी जानकारी /proc
वैसे भी मिल जाती है, लेकिन चूंकि यह उत्पादन कोड के लिए है, इसलिए मैं निश्चित होना चाहता हूं।
तो, क्या ऐसे मामले हो सकते हैं जहां किसी चल रही प्रक्रिया की कोई /proc/PID
निर्देशिका नहीं है या जहां एक /proc/PID
निर्देशिका मौजूद है और प्रक्रिया नहीं चल रही है? क्या ps
निर्देशिका के अस्तित्व के लिए जाँच करने से अधिक पसंद करने का कोई कारण है ?
kill -0
सबसे अच्छा है), यह केवल आपको बताता है कि क्या दिए गए PID के साथ कोई चल रही प्रक्रिया है । यह आपको यह नहीं बताता है कि क्या प्रक्रिया अभी भी एक मिलीसेकंड बाद में चल रही है, और यह आपको यह नहीं बताती है कि क्या प्रक्रिया वह है जिसमें आप रुचि रखते हैं या एक असंबंधित प्रक्रिया है जिसे दिलचस्प प्रक्रिया के बाद उसी पीआईडी को सौंपा गया है । यह हमेशा परीक्षण करने के लिए लगभग एक गलती है कि क्या किसी दिए गए पीआईडी चल रहा है : बहुत कम परिस्थितियां हैं जहां यह दौड़ की स्थिति से ग्रस्त नहीं है।
kill
सिग्नल 0 का उपयोग करके भी पेरल फ़ंक्शन होता है जो कोई हत्या नहीं करता है लेकिन कहता है कि क्या आप ऐसा कर सकते हैं (यानी आपको उस प्रक्रिया को संकेत देने के लिए अनुमति की आवश्यकता है)।