2010-06-01 9 views
5

मेरे पास एक काम कर रहे पायथन आधारित प्रोग्राम है जिसे मैं डिमन के रूप में चलाने के लिए चाहता हूं। वर्तमान में मैं इसे screen-d -m name सत्र के साथ शुरू करने और इसे pkill -9 -f name के साथ मारने के बहुत ही हैश तरीके से कर रहा हूं।मैं लिनक्स पर पाइथन आधारित डिमन का प्रबंधन कैसे करूं?

आखिरकार मैं इसे बेहतर सिस्टम में स्थानांतरित करने के लिए कर रहा हूं जिसका उपयोग हम यहां करते हैं (इस प्रकार मैं प्रोग्राम को संशोधित करने के लिए तैयार नहीं हूं) लेकिन अंतरिम में, मैं करने के लिए एक क्लीनर तरीका ढूंढ रहा हूं इस।

मेरी वर्तमान सोच एक inti.d स्क्रिप्ट से पृष्ठभूमि कार्य के रूप में इसे लात मार रही है, लेकिन मैं इसे वापस लाने के लिए भाग कैसे लिखूं?

उत्तर

1

एक init.d शैली स्क्रिप्ट के साथ यह है शुरू एक अच्छा तरीका है। आप इसे POSIX सिग्नल के साथ ले जाते हैं ... StackOverflow, Signal handling in Python देखें।

+0

मैं अपनी देखभाल के लिए इसे मार सकता हूं, लेकिन मुझे नहीं पता कि इसके पीआईडी ​​को विश्वसनीय रूप से कैसे प्राप्त किया जाए। – BCS

+0

@ बीबीसीएस: '-9' अक्सर होता है ... * ओवरकिल * (क्षमा को क्षमा करें)। देखें [kill -9] (http://speculation.org/garrick/kill-9.html)। अपनी पीआईडी ​​खोजने के लिए, आपकी स्क्रिप्ट '/ var/run' में एक पिडफाइल बना सकती है या एक lib का उपयोग कर सकती है जो आपको' pkill' के साथ उपयोग के लिए कुछ आसानी से पहचाने गए नाम पर 'argv [0]' सेट करने की अनुमति देती है। –

6

linux पर init.d टूल्स के हिस्से के रूप में start-stop-daemon उपयोगिता है।

यह बहुत लचीला है और आपके सर्वर के पिड को कैप्चर करने के विभिन्न तरीकों की अनुमति देता है।

एक फ़ाइल /etc/init.d/skeleton भी है जो आपके init.d स्क्रिप्ट के आधार के रूप में कार्य कर सकती है।

यदि आपका लक्षित प्लेटफ़ॉर्म डेबियन आधारित है, तो इसे तैनात करने के लिए एक डेबिन पैकेज बनाने का अर्थ होता है क्योंकि यह शेष सिस्टम में सही ढंग से डिमन को एकीकृत करने में भी मदद करता है। और यह बहुत जटिल नहीं है (यदि आपने इसे दस बार पहले किया है ;-)

+0

अच्छी चीजें दिखता है। – BCS

3

यदि आप इसे पायथन में कोड के साथ करना चाहते हैं, तो यह एक सुंदर मानक सी-विधि है जिसे मैं उपयोग करने वाले पायथन पर पोर्ट किया गया था। यह बेकार ढंग से काम करता है, और आप एक फ़ाइल आउटपुट भी चुन सकते हैं।

import os 
import signal 
def daemonize(workingdir='.', umask=0,outfile='/dev/null'): 
#Put in background 
pid = os.fork() 
if pid == 0: 
    #First child 
    os.setsid() 
    pid = os.fork() #fork again 
    if pid == 0: 
     os.chdir(workingdir) 
     os.umask(umask) 
    else: 
     os._exit(0) 
else: 
    os._exit(0) 

#Close all open resources 
try: 
    os.close(0) 
    os.close(1) 
    os.close(2) 
except: 
    raise Exception("Unable to close standard output. Try running with 'nodaemon'") 
    os._exit(1) 

#Redirect output 
os.open(outfile, os.O_RDWR | os.O_CREAT) 
os.dup2(0,1) 
os.dup2(0,2) 

उसके बाद, आप को पकड़ने के लिए जब एक मार-संकेत अच्छी तरह से कार्यक्रम और बाहर निकलने के लिए भेजा गया था संकेतों का उपयोग कर सकते हैं। से Python Docs

import signal, os 

def handler(signum, frame): 
    print 'Signal handler called with signal', signum 
    raise IOError("Couldn't open device!") 

# Set the signal handler and a 5-second alarm 
signal.signal(signal.SIGALRM, handler) 
signal.alarm(5) 

# This open() may hang indefinitely 
fd = os.open('/dev/ttyS0', os.O_RDWR) 

signal.alarm(0)   # Disable the alarm 
+0

डबल फोर्क विधि एक आकर्षण की तरह काम करता है! – pygabriel

0

उदाहरण इस question या अधिक वास्तव में स्वीकार किए जाते हैं समाधान का प्रयास करें।

+0

मैं वास्तव में कार्यक्रम के आंतरिक के साथ बकवास नहीं होगा। बिल्ली मैं ऐसा करने के बजाय अब मैं जो भी उपयोग कर रहा हूं उसे रखना चाहता हूं। – BCS

+0

वास्तव में आपको आयात करने योग्य होने पर, अपने प्रोग्राम को बदलने की आवश्यकता नहीं है। जौस्ट डेमॉन-उदाहरण में अपना मुख्य आयात करें रन विधि, (लूप के दौरान प्रतिस्थापित करें)। – Ib33X

2

ऐसे मॉड्यूल हैं जिनका उपयोग एक पायथन लिपि को डिमन करने के लिए किया जा सकता है।

python-daemon अच्छी तरह से व्यवहार किए गए डिमन विनिर्देश (पीईपी 3143) लागू करता है।

भी this module हाल ही में जिथब पर आया जो अधिक पाइथनिक और उपयोग करने में आसान लगता है।

संबंधित मुद्दे