2010-09-14 16 views

उत्तर

20

पीआईडी ​​फ़ाइल बनाने का सबसे आम तरीका है: एक स्थान परिभाषित करें जहां फ़ाइल जाएगी (अंदर/var/run सामान्य है)। सफल स्टार्टअप पर, आप इस फ़ाइल में अपना पीआईडी ​​लिखेंगे। यह तय करते समय कि क्या शुरू करना है, फ़ाइल को पढ़ें और यह सुनिश्चित करने के लिए जांचें कि संदर्भित प्रक्रिया मौजूद नहीं है (या यदि ऐसा होता है, तो यह आपके डिमन का उदाहरण नहीं है: लिनक्स पर, आप /proc/$PID/exe देख सकते हैं)। शटडाउन पर, आप फ़ाइल को हटा सकते हैं लेकिन यह कड़ाई से जरूरी नहीं है।

आपको ऐसा करने में मदद करने के लिए स्क्रिप्ट हैं, आपको start-stop-daemon उपयोगी होने के लिए मिल सकता है: यह पीआईडी ​​फाइलों का उपयोग कर सकता है या यहां तक ​​कि केवल निष्पादन योग्य के अस्तित्व के लिए वैश्विक रूप से जांच सकता है। यह इस कार्य के लिए ठीक से डिजाइन किया गया है और लोगों को इसे सही करने में मदद करने के लिए लिखा गया था।

+0

आमतौर पर पिड का उपयोग करने की प्रक्रिया सुनिश्चित करने के लिए, इस तरह की एक पिड फ़ाइल पर 'झुंड' का उपयोग करना एक अच्छा विचार है। – Hasturkun

+0

हाँ, पिड फ़ाइल पर एक विशेष लॉक डालें, और इसे वहां छोड़ दें। यदि लॉक विफल रहता है, तो दूसरा उदाहरण चल रहा है। – MarkR

+0

यह इस बात पर निर्भर करता है कि क्या आप डीआईएम प्रक्रिया का उपयोग कर पीआईडी ​​फ़ाइल लिख रहे हैं या नहीं: यदि आप 'स्टार्ट-स्टॉप-डिमन' या इसी तरह का उपयोग कर रहे हैं, तो आप फ़ाइल को इस तरह से लॉक नहीं कर सकते हैं। इसके अलावा, भले ही आप लॉक प्राप्त करने के लिए प्रबंधन करते हैं, फिर भी आपको फ़ाइल में निहित पीआईडी ​​की जांच करनी चाहिए, इसलिए मुझे यकीन नहीं है कि यह आपको बहुत लाभ पहुंचाएगा। –

3

आप कोड के लिए उपयोग है (अर्थात यह लिख रहे हैं):

  • एक अस्थायी फ़ाइल बनाने, यह ताला, जब किया निकालने के लिए, return 1; यदि फ़ाइल मौजूद है, या,
  • सूची प्रक्रियाओं, return 1; यदि प्रक्रिया नाम सूची

में है ऐसा न करने पर:

  • मूल्य बना ई प्रोग्राम के लिए लॉन्चर रैपर जो उपर्युक्त
+0

ठीक है , यह दिलचस्प लगता है। लेकिन अगर अस्थायी फ़ाइल को हटाए जाने से पहले प्रक्रिया मारे जाए तो क्या होगा? –

+0

यह एक समस्या है, हाँ। हालांकि, आप इस समस्या से बचने के लिए दूसरी विधि का उपयोग कर सकते हैं। –

+0

या एक सामान्य फ़ाइल है जैसे 'application.pid' जिस पर एक विशेष लॉक प्राप्त करने के लिए, जो आवेदन के अंत में जारी किया जाएगा। – mhitza

2

मुझे नहीं पता कि आपकी सटीक आवश्यकता क्या है लेकिन मुझे एक समान आवश्यकता थी; उस स्थिति में मैंने शैल स्क्रिप्ट से अपना डिमन शुरू किया (यह एक एचपी-यूएक्स मशीन थी) और डेमॉन शुरू करने से पहले मैंने जांच की कि क्या एक ही नाम से एक निष्पादन पहले से चल रहा है। अगर यह होता है; तो एक नया शुरू मत करो।

इस तरह से मैं एक प्रक्रिया के उदाहरणों की संख्या को नियंत्रित करने में भी सक्षम था।

+0

और आप कैसे जांचते हैं कि "एक ही नाम से एक exec पहले से चल रहा है"? – phunehehe

+0

आप 'ps' कमांड का उपयोग कर चल रही प्रक्रियाओं को सूचीबद्ध कर सकते हैं। कम से कम एचपी-यूएक्स में। – Vaibhav

+0

मेरे पास एक ऐसी स्क्रिप्ट है जो इस तरह काम करती है। यह बहुत उपयोगी है, लेकिन यह भरोसेमंद करना असंभव है। जैसे यदि निष्पादन एक स्क्रिप्ट है जिसे आप चलाना देखेंगे दुभाषिया (sh, या perl, या जो कुछ भी है) और स्क्रिप्ट का नाम पहला तर्क है। लेकिन एक नकली नाम के साथ एक कार्यक्रम को निष्पादित करना भी संभव है जिसमें आप वास्तव में यह नहीं पहचान पाएंगे कि इसे कैसे पहचानें। आप/proc फाइल सिस्टम को भी देख सकते हैं। लेकिन इस 100% विश्वसनीय बनाने का कोई तरीका नहीं है। – reinierpost

5

प्रक्रिया द्वारा बनाए गए मेमोरी ब्लॉक बनाने के लिए boost interprocess library का उपयोग करें। यदि यह पहले से मौजूद है, तो इसका मतलब है कि प्रक्रिया का एक और उदाहरण है। बाहर जाएं।

आपको जो चाहिए उससे अधिक सटीक लिंक this one होगा।

#include <boost/interprocess/shared_memory_object.hpp> 
#include <boost/scoped_ptr.hpp> 

int main() 
{ 
    using boost::interprocess; 
    boost::scoped_ptr<shared_memory_object> createSharedMemoryOrDie; 
    try 
    { 
    createSharedMemoryOrDie.reset( 
     new shared_memory_object(create_only, "shared_memory", read_write)); 
    } catch(...) 
    { 
    // executable is already running 
    return 1; 
    } 

    // do your thing here 
} 
+1

क्या यह काम करेगा अगर प्रक्रिया को -9 के साथ मार दिया गया है इससे पहले कि यह shared_memory_object को मुक्त कर सके? – rustyx

2

मुझे लगता है कि इस योजना के काम करना चाहिए (और दुर्घटनाओं के खिलाफ भी मजबूत है):
पूर्वशर्त: आपके आवेदन के लिए एक पीआईडी ​​फ़ाइल (आमतौर पर/var/समय में /) नहीं है पीआईडी ​​फ़ाइल खोलने के लिए
1. कोशिश
2. यदि यह अस्तित्व में नहीं है, तो इसे बनाएं और इसे अपनी पीआईडी ​​लिखें। कार्यक्रम
3. के बाकी के साथ जारी रखें अगर यह मौजूद है, पीआईडी ​​
4. पढ़ पीआईडी ​​अभी भी चल रहा है और अपने कार्यक्रम का एक उदाहरण है, तो
5. बाहर निकलने पीआईडी ​​मौजूद नहीं है या किसी अन्य प्रोग्राम द्वारा उपयोग किया जाता है, पीआईडी ​​फ़ाइल को हटाएं और चरण 2 पर जाएं।
6. प्रोग्राम समाप्ति पर, पीआईडी ​​फ़ाइल को हटा दें।

चरण 5 में लूप सुनिश्चित करता है कि, यदि एक ही समय में दो उदाहरण शुरू हो गए हैं, तो अंत में केवल एक ही चल रहा है।

+0

यदि आप अपनी पिड नहीं मिला है तो मैं पिड फ़ाइल को नहीं हटाऊंगा, क्योंकि यह दौड़ की स्थिति पेश कर सकता है। – MarkR

0

एक पिड फ़ाइल है और स्टार्टअप पर 'kill -0 <pid>' करें। फ़ाइल से मूल्य कहां पढ़ा जाता है। अगर प्रतिक्रिया है! = 0 तो डिमन जीवित नहीं है और आप इसे पुनरारंभ कर सकते हैं

एक और दृष्टिकोण एक बंदरगाह से बांधना और डिमन शुरू करने के दूसरे प्रयास पर बाध्य अपवाद को संभालना होगा। यदि बंदरगाह उपयोग में है तो बाहर निकलें अन्यथा डिमन चलाना जारी रखें।

+2

हत्या -0 केवल आपको बताएगा कि प्रक्रिया मौजूद है, न कि यह आपका डिमन है। मैंने एक कष्टप्रद बग देखा है (बूट समय पर जहां पिड संख्या अनुक्रमिक हैं) एक और प्रक्रिया एक ही पिड लेती है, और एक डिमन को गलती से स्टार्टअप में विफल होने का कारण बनता है। – MarkR

-1

मेरा मानना ​​है कि मेरे समाधान सरल है:

(उसका उपयोग नहीं करते, तो रेसिंग हालत एक संभव परिदृश्य है, लेकिन किसी भी अन्य मामले पर यह एक सरल और संतोषजनक समाधान है)

#include <sys/types.h> 
#include <unistd.h> 
#include <sstream> 

void main() 
{ 
    // get this process pid 
    pid_t pid = getpid(); 

    // compose a bash command that: 
    // check if another process with the same name as yours 
    // but with different pid is running 
    std::stringstream command; 
    command << "ps -eo pid,comm | grep <process name> | grep -v " << pid; 
    int isRuning = system(command.str().c_str()); 
    if (isRuning == 0) { 
     cout << "Another process already running. exiting." << endl; 
     return 1; 
    } 
    return 0; 
} 
संबंधित मुद्दे