मैं पाइथन-डेमन का उपयोग कर रहा हूं, और समस्या यह है कि जब मैं kill -9
एक प्रक्रिया करता हूं, तो यह पीछे एक पिडफाइल छोड़ देता है (ठीक है) और अगली बार जब मैं दौड़ता हूं मेरा प्रोग्राम यह तब तक काम नहीं करता जब तक कि मैंने पहले ही हाथ से पिडफाइल हटा दिया हो (ठीक नहीं)।पायथन-डिमन संदर्भ तब शुरू होने में विफल रहता है जब एक पुरानी पीआईडी फ़ाइल मौजूद होती है
मैं क्रम में सभी अपवादों को पकड़ने कि context.close()
समाप्त होने से पहले कहा जाता है - जब यह (जैसे एक kill
पर) होता है /var/run/mydaemon.pid* फ़ाइलें निकाल दिए जाते हैं और बाद में एक डेमॉन रन सफल होता है। हालांकि, SIGKILL (kill -9
) का उपयोग करते समय, मुझे context.close()
पर कॉल करने का मौका नहीं है, और/var/run फ़ाइलें बनी रहती हैं। इस उदाहरण में, अगली बार जब मैं अपना प्रोग्राम चलाता हूं तो यह सफलतापूर्वक शुरू नहीं होता है - मूल प्रक्रिया लौटाती है, लेकिन context.open()
पर डिमोनाइज्ड प्रक्रिया ब्लॉक होती है।
ऐसा लगता है कि पाइथन-डेमन को यह देखना चाहिए कि ऐसी प्रक्रिया के लिए एक पिडफाइल है जो अब मौजूद नहीं है, और इसे साफ़ कर रहा है, लेकिन ऐसा नहीं हो रहा है। क्या मैं इसे हाथ से कर रहा हूं?
नोट: मैं with
का उपयोग नहीं कर रहा हूँ क्योंकि इस कोड को अजगर 2,4
from daemon import DaemonContext
from daemon.pidlockfile import PIDLockFile
context = DaemonContext(pidfile = PIDLockFile("/var/run/mydaemon.pid"))
context.open()
try:
retry_main_loop()
except Exception, e:
pass
context.close()
यह दो साल पहले था, इसलिए मेरी स्मृति धुंधला है, लेकिन हाँ, मुझे लगता है कि यह है कि कैसे मैं यह किया (मैं क्या मतलब प्रश्न में संदर्भित "हाथ से ऐसा करना")। उत्तर के रूप में चिह्नित क्योंकि क्यों नहीं। – kdt