क्या .pid फाइलें यह निर्धारित करने के लिए विश्वसनीय हैं कि क्या कोई प्रक्रिया चल रही है?


11

कई प्रोग्राम जैसे sshd बनाते हैं। Pid फ़ाइलों को / var / run / में शामिल करते हैं, जिसमें उनकी प्रक्रिया ID होती है। क्या ये फ़ाइलें यह निर्धारित करने के लिए विश्वसनीय हैं कि क्या कोई प्रक्रिया चल रही है? मेरा अनुमान है कि ये फाइलें एक प्रक्रिया द्वारा मैन्युअल रूप से बनाई गई हैं, और इसलिए प्रोग्राम क्रैश होने पर भी फाइल सिस्टम में रहेगा।

जवाबों:


16

सरल शब्दों में, नहीं : एक प्रक्रिया (जैसे एक डेमन) दुर्घटनाग्रस्त हो सकती है और इसकी .pid फ़ाइल को खाली करने का समय नहीं होता है।

एक कार्यक्रम की स्थिति के बारे में अधिक निश्चित होने की तकनीक: एक स्पष्ट संचार चैनल जैसे सॉकेट का उपयोग करें। सॉकेट पोर्ट को एक फ़ाइल में लिखें और इस supervisorप्रक्रिया को इसे देखें।

आप लिनक्स पर DBus की सेवाओं का उपयोग कर सकते हैं: एक विशिष्ट नाम पंजीकृत करें और उस नाम के लिए अपनी पर्यवेक्षक प्रक्रिया (जो भी आप इसे कहते हैं) की जांच करें।

कई तकनीकें हैं।

एक बात याद रखें: यह पीआईडी ​​फाइलों का प्रबंधन करने के लिए ओएस की जिम्मेदारी नहीं है।


1
हालांकि, इस प्रक्रिया के अस्तित्व के साथ, पीआईडी ​​फ़ाइल का अस्तित्व पर्याप्त होना चाहिए। यदि प्रक्रिया छोड़ दी जाती है, तो आप इसकी जांच कर सकते हैं। पीआईडी ​​का पुन: उपयोग नहीं किया जाता है, लेकिन बहुत बार नहीं।
मार्क

2
कितनी बार एक पिड का पुन: उपयोग किया जाता है यह प्रश्न में विशेष प्रणाली पर निर्भर करता है। मैंने देखा है कि एक प्रणाली कम से कम दैनिक रूप से साइकिल चालित थी। आपको pid ​​की जाँच करनी है, कि एक प्रक्रिया है, और यह प्रक्रिया वह है जो आप pid के मालिक होने की अपेक्षा करते हैं।

@atk: बिल्कुल। कोई मानक प्रति-से नहीं है और यहां तक ​​कि अगर एक था, तो यह बहुत अच्छी तरह से कुछ कार्यान्वयनों द्वारा सम्मानित नहीं किया जा सकता है। उदाहरण के लिए, मैं एक डेमॉन को तैयार कर सकता हूं जो एक पीआईडी ​​फ़ाइल नहीं लिखता है और अपने प्रबंधन आदेशों को प्राप्त करने के लिए एक बैक चैनल का उपयोग करता है।
जूलुपोंट

@atk: दुर्भाग्य से, यह सुनिश्चित करने का कोई तरीका नहीं है कि पीआईडी ​​को चेक के समय और उपयोग के समय के बीच पुन: उपयोग नहीं किया जाता है ...
SamB

3

Jldupont यह बताते हुए सही है कि .pid फाइलें यह निर्धारित करने के लिए विश्वसनीय नहीं हैं कि क्या प्रक्रिया चल रही है क्योंकि फ़ाइल क्रैश की स्थिति में नहीं हटाई जा सकती है।

एक तरफ दौड़ की स्थिति, मैं अक्सर pgrep का उपयोग करता हूं जब मुझे यह जानने की आवश्यकता होती है कि क्या कोई प्रक्रिया चल रही है। यदि आवश्यक हो तो मैं .pid फ़ाइल (s) के खिलाफ आउटपुट को क्रॉस-रेफर कर सकता हूं।


3

एक प्रक्रिया आईडी वाली फाइल विश्वसनीय नहीं है यह निर्धारित करें कि कोई प्रक्रिया चल रही है या नहीं। यह प्रक्रिया के लिए अंतिम दी गई प्रक्रिया आईडी का पता लगाने के लिए सिर्फ एक विश्वसनीय स्रोत है।

जब आपके पास प्रक्रिया आईडी होती है, तो आपको फ्यूचर चेकिंग करनी होती है, यदि प्रक्रिया वास्तव में चल रही हो।

यहाँ एक उदाहरण है:

#!/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 एक अच्छी कमांड है, लेकिन जब आप एक से अधिक इंस्टेंसेस चलाते हैं, तो आप परेशानी में पड़ जाते हैं। उदाहरण के लिए जब आपके पास पोर्ट टीसीपी / 22 पर एक नियमित sshd चल रहा है और आपके पास पोर्ट टीसीपी / 2222 पर चलने वाला एक और sshd है, तो pgrep खोजते समय दो प्रोसेस आईडी डिलीवर करेगा sshd को ... जब सामान्य sshd अपने pid / var में होता है /run/sshd.pid और दूसरा /var/run/sshd-other.pid में स्पष्ट रूप से भिन्न हो सकता है।

मैं सिर्फ ps का उपयोग करने की सलाह नहीं देता , grep और grep के साथ एक या कई पाइपों के माध्यम से पाइपिंग -v सभी अन्य सामानों को फ़िल्टर करने की कोशिश करता है जो आपको रुचि नहीं देता है ... यह उपयोग करने की तरह थोड़ा सा है

find . | grep myfile

यह पता लगाने के लिए, यदि कोई फ़ाइल बाहर निकलती है।


2

यह केवल फ़ाइल में निहित के रूप में एक ही पिड के साथ एक प्रक्रिया के अस्तित्व की जांच करने के लिए विश्वसनीय नहीं है।

लेकिन कई pidfile कार्यान्वयन भी pidfile पर लॉकिंग करते हैं, ताकि यदि प्रक्रिया मर जाती है, तो लॉक दूर हो जाता है। बशर्ते लॉकिंग मैकेनिज्म विश्वसनीय हो, यह देखने के लिए जाँच करें कि क्या फाइल अभी भी लॉक है, यह निर्धारित करने के लिए एक अपेक्षाकृत विश्वसनीय मैकेनिज्म है कि क्या मूल प्रक्रिया अभी भी चल रही है।


1

Jldupont सही है।

हालाँकि, आप इस प्रक्रिया को 0 सिग्नल (किल-एस 0 पीआईडी) यह देखने के लिए भेज सकते हैं कि क्या यह प्रक्रिया अभी भी जीवित है (मान लें कि आपके पास ऐसा सिग्नल भेजने का अधिकार है - सामान्य तौर पर, केवल एक प्रक्रिया का मालिक ही भेज सकता है यह एक संकेत है)।


4
लेकिन उस पीआईडी ​​के साथ एक प्रक्रिया के अस्तित्व के लिए जाँच करने का मतलब यह नहीं है कि यह पीआईडी ​​है जिसमें आप रुचि रखते हैं।
जनम

0

मैं jschmier से सहमत हूं।

कुछ सिस्टम पर, आपको pgrep तक पहुँच नहीं मिलती है। ऐसे मामले में, आप यह ps -aef | grep <pid>पता लगाने के लिए कर सकते हैं कि क्या प्रक्रिया वास्तव में चल रही है।


1
प्रश्न में मुख्य बिंदु "विश्वसनीय" था। पीएस करना और पीआईडी ​​की तलाश विश्वसनीय नहीं है।
जनम

अच्छा ... यह मानते हुए कि आप कार्यक्रम के उस नाम को जानते हैं, आप क्यों सोचते हैं ps -aef | grep अविश्वसनीय है?
user29584

3
दौड़ की स्थिति: पीएस समाप्त होने तक सिस्टम की स्थिति बदल गई है। प्रक्रिया शीर्षक: एक अन्य प्रक्रिया में आपकी रुचि के समान शीर्षक हो सकता है। कई उदाहरण: एक ही सेवा के दो उदाहरणों के साथ एक प्रणाली पर विचार करें, प्रत्येक पीआईडी ​​फ़ाइल के साथ। एक विफल हो जाता है, और दूसरा पुनरारंभ होता है और पहली सेवा का पीआईडी ​​प्राप्त करता है। कैसे बताऊँ? आदि विश्वसनीय नहीं, दौड़ की स्थिति के कारण सही होना असंभव है, और ऐसी विश्वसनीय तकनीकें हैं जो सिर्फ काम करती हैं। एक विश्वसनीय विकल्प देखने के लिए, उदाहरण के लिए, cr.yp.to/daemontools.html
janm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.