2012-01-26 14 views
6

मैं पाइथन-डेमन का उपयोग कर रहा हूं, और समस्या यह है कि जब मैं 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() 

उत्तर

1

यदि आप लिनक्स चला रहे हैं, और प्रक्रिया स्तर ताले स्वीकार्य हैं, तो पढ़ें।

हम लॉक प्राप्त करने का प्रयास करते हैं। यदि यह विफल हो जाता है, तो जांचें कि लॉक एक चल रही प्रक्रिया द्वारा अधिग्रहित किया गया है या नहीं। यदि नहीं, तो लॉक तोड़ें और जारी रखें।

from lockfile.pidlockfile import PIDLockFile 
from lockfile import AlreadyLocked 

pidfile = PIDLockFile("/var/run/mydaemon.pid", timeout=-1) 
try: 
    pidfile.acquire() 
except AlreadyLocked: 
    try: 
     os.kill(pidfile.read_pid(), 0) 
     print 'Process already running!' 
     exit(1) 
    except OSError: #No process with locked PID 
     pidfile.break_lock() 

#pidfile can now be used to create DaemonContext 

संपादित करें: ऐसा लगता है कि PIDLockFile केवल lockfile पर उपलब्ध है> = 0.9

+0

यह दो साल पहले था, इसलिए मेरी स्मृति धुंधला है, लेकिन हाँ, मुझे लगता है कि यह है कि कैसे मैं यह किया (मैं क्या मतलब प्रश्न में संदर्भित "हाथ से ऐसा करना")। उत्तर के रूप में चिह्नित क्योंकि क्यों नहीं। – kdt

1

पर चलता है here पीआईडी ​​फ़ाइल प्रदान की गई स्क्रिप्ट के साथ मार पर रहता है -9 के रूप में आप कहते हैं, लेकिन स्क्रिप्ट भी साफ़ ठीक से पुनरारंभ पर।