2009-02-26 17 views
23

मेरे पास एक उपकरण है जिसे मैंने पायथन में लिखा है और आम तौर पर इसे डिमन के रूप में चलाया जाना चाहिए। वितरण के लिए इस उपकरण को पैकेज करने के लिए सर्वोत्तम प्रथाएं क्या हैं, विशेष रूप से सेटिंग्स फ़ाइलों और डेमॉन निष्पादन योग्य/स्क्रिप्ट को कैसे प्रबंधित किया जाना चाहिए?पायथन डेमॉन पैकेजिंग सर्वोत्तम अभ्यास

Relatedly वहाँ बूट पर उचित रूप में दिया मंच के लिए चलाने के लिए डेमॉन स्थापित करने के लिए किसी भी आम उपकरणों (linux पर अर्थात init लिपियों, सेवाओं खिड़कियों पर, पर ओएस एक्स launchd) कर रहे हैं?

+1

यह SO प्रश्न भी देखें: http://stackoverflow.com/questions/473620/how-do-you-create-a-daemon-in-python – Rabarberski

उत्तर

11

अपने प्रश्न का एक हिस्सा उत्तर देने के लिए, वहाँ कोई उपकरण मैं उस के बारे में पता portably भी लिनक्स सिस्टम में डेमॉन सेटअप करना होगा अकेले विंडोज या मैक ओएस एक्स

अधिकांश लिनक्स वितरण के भीतर start-stop-daemon ज़रिये जुड़े हुए हैं कर रहे हैं अब init स्क्रिप्ट्स, लेकिन आप अभी भी फाइल सिस्टम लेआउट में मामूली अंतर और पैकेजिंग में बड़े अंतर होने जा रहे हैं। ऑटोटूल/कॉन्फ़िगरेशन, या डिस्ट्यूट/easy_install का उपयोग करना यदि आपकी परियोजना सभी पाइथन है, तो विभिन्न लिनक्स/बीएसडी वितरण के लिए पैकेज बनाने में आसान बनाने के लिए एक लंबा रास्ता तय होगा।

विंडोज एक अलग अलग गेम है और Mark Hammond's win32 एक्सटेंशन और शायद Tim Golden's WMI एक्सटेंशन की आवश्यकता होगी।

मुझे लॉन्च नहीं पता है कि "उपरोक्त में से कोई भी" प्रासंगिक नहीं है।

पाइथन स्क्रिप्ट को डिमोनिज़ करने पर युक्तियों के लिए, मैं वास्तव में असली दुनिया में ऐसा कर रहा हूं, उदाहरण के लिए ट्विस्ट के अंदर।

14

init.d स्क्रिप्ट्स के साथ मदद करने के लिए मैंने पाया सबसे अच्छा टूल "स्टार्ट-स्टॉप-डिमन" है। यह किसी भी एप्लिकेशन को चलाएगा, रन/पिड फाइलों की निगरानी करेगा, आवश्यक होने पर उन्हें बनाएं, डेमॉन को रोकने के तरीके प्रदान करें, प्रक्रिया उपयोगकर्ता/समूह आईडी सेट करें, और अपनी प्रक्रिया को पृष्ठभूमि भी दे सकते हैं।

#! /bin/bash 

case "$1" in 
    start) 
    echo "Starting server" 

    # Activate the virtual environment 
    . /home/ali/wer-gcms/g-env/bin/activate 

    # Run start-stop-daemon, the $DAEMON variable contains the path to the 
    # application to run 
    start-stop-daemon --start --pidfile $WSGI_PIDFILE \ 
     --user www-data --group www-data \ 
     --chuid www-data \ 
     --exec "$DAEMON" 
    ;; 
    stop) 
    echo "Stopping WSGI Application" 

    # Start-stop daemon can also stop the application by sending sig 15 
    # (configurable) to the process id contained in the run/pid file 
    start-stop-daemon --stop --pidfile $WSGI_PIDFILE --verbose 
    ;; 
    *) 
    # Refuse to do other stuff 
    echo "Usage: /etc/init.d/wsgi-application.sh {start|stop}" 
    exit 1 
    ;; 
esac 

exit 0 

तुम भी वहाँ कैसे एक virtualenv है, जो मैं हमेशा की सिफारिश करेंगे के साथ उपयोग करने का एक उदाहरण देख सकते हैं:

उदाहरण के लिए, इस एक स्क्रिप्ट जो शुरू कर सकते हैं/एक WSGI सर्वर रोक है।

-10

"आम तौर पर एक डेमॉन के रूप में चलाया जाना चाहिए?"

सतह पर नहीं - बहुत समझ में आता है। "आम तौर पर" समझदार नहीं है। यह या तो एक डिमन है या नहीं। आप अपना प्रश्न अपडेट करना चाहेंगे।

डेमन्स के उदाहरणों के लिए, अपाचे के httpd या किसी डेटाबेस सर्वर (वे डिमन्स) या SMTPD मेल डिमन जैसे डिमन्स पर पढ़ें।

या, शायद, कुछ आसान पर पढ़ें, जैसे कि एफ़टीपी डिमन, एसएसएच डिमन, टेलनेट डिमन।

लिनक्स दुनिया में, आपके पास अपनी एप्लिकेशन स्थापना निर्देशिका, कुछ कार्यशील निर्देशिका, साथ ही कॉन्फ़िगरेशन फ़ाइल निर्देशिका भी होगी।

हम आवेदन के लिए /opt/ourapp का उपयोग करें (यह अजगर है, लेकिन हम स्थापित नहीं करते में पायथन के lib/site-packages)

हम काम फ़ाइलें और हमारे विन्यास फाइल के लिए /var/ourapp का उपयोग करें।

हम विन्यास फाइलों के लिए /etc/ourapp का उपयोग कर सकते हैं - यह लगातार होगा - लेकिन हम नहीं करते हैं।

हम अभी तक नहीं - अभी तक - init.d स्टार्टअप के लिए स्क्रिप्ट का उपयोग करें। लेकिन यह अंतिम टुकड़ा है, स्वचालित स्टार्टअप। अभी के लिए, हमारे पास sys admins daemons शुरू करते हैं।

यह आंशिक रूप से http://www.pathname.com/fhs/ और http://tldp.org/LDP/Linux-Filesystem-Hierarchy/html/Linux-Filesystem-Hierarchy.html पर आधारित है।

+2

आप सुंदर हैं कठोर !? डेमॉन केवल वे प्रोग्राम हैं जो डिमोनाइज्ड हैं। कभी-कभी उन्हें Ctrl-c के लिए नियमित प्रक्रिया के रूप में चलाने के लिए उपयोगी होता है, stdout आदि पर आउटपुट देखें। – fulmicoton

+0

@ पॉल: सहमत। क्या आप इस सवाल को स्पष्ट कर सकते हैं? –

0

लिनक्स सिस्टम पर, सिस्टम के पैकेज मैनेजर (जेनेटू के लिए पोर्टेज, उबंटू/डेबियन के लिए योग्यता, फेडोरा के लिए यम, आदि) आमतौर पर सही जगहों पर इनिट स्क्रिप्ट रखने सहित प्रोग्राम इंस्टॉल करने का ख्याल रखता है। यदि आप लिनक्स के लिए अपना प्रोग्राम वितरित करना चाहते हैं, तो हो सकता है कि आप इसे विभिन्न वितरण पैकेज पैकेजर्स के उचित प्रारूप में बंडल करना चाहें।

यह सलाह उन प्रणालियों पर स्पष्ट रूप से अप्रासंगिक है जिनके पास पैकेज प्रबंधक नहीं हैं (विंडोज़, और मैक मुझे लगता है)।

+0

कई अन्य इकाइयों के लिए पैकेजिंग सिस्टम हैं! उदाहरण के लिए नेटबीएसडी के लिए pkgsrc। – bortzmeyer

+0

दिलचस्प, मुझे नहीं पता था कि –

8

इंटरनेट पेशकश पर अधिक स्निपेट शुद्ध अजगर में एक डेमॉन (कोई पार्टी लिपियों)

http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/ साफ लग रहा है ...

आप अपने खुद के लिखने के लिए चाहते हैं, लिखने के लिए कर रहे हैं
सिद्धांत बैश डिमन समारोह के समान है।

मूल रूप से

:

शुरुआत में:

  • आप किसी अन्य प्रक्रिया
  • को कांटा पीआईडी ​​कहीं अपने stdout और stderr
  • सहेजें रीडायरेक्ट करने के लिए एक लॉगफ़ाइल खोलें।

स्टॉप पर:

  • आप पीआईडी ​​अपने pidfile में संग्रहीत के साथ प्रक्रिया को SIGTERM भेजें।
  • सिग्नल.signal (सिग्नल एसआईजीटरएम, सिगरमैंडलर) के साथ आप SIGTERM सिग्नल को प्रक्रिया को रोक सकते हैं।

मुझे यह किसी भी व्यापक रूप से उपयोग किए जाने वाले पैकेज को नहीं पता है।

+1

+1 पायथन डेमॉन के लिए। मैं वास्तव में इस तरह के एक समान नुस्खा का उपयोग करता हूं, सिवाय इसके कि मैं इसे बैश स्क्रिप्ट से स्टार्ट-स्टॉप-डिमन के साथ लॉन्च करता हूं। हो सकता है कि एक कदम बहुत अधिक हो, लेकिन यह मुझे अन्य सभी डिमों की तरह व्यवहार करने के लिए एक गर्म अस्पष्ट भावना देता है! –

3

मुझे याद नहीं है कि मैंने इसे कहां डाउनलोड किया है ... लेकिन यह मुझे सबसे अच्छी डिमनीकरण स्क्रिप्ट है जो मैंने पाया है। यह (मैक और लिनक्स पर।) खूबसूरती से काम करता है (daemonize.py के रूप में सहेज)

import sys, os 
def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): 
    # Perform first fork. 
    try: 
     pid = os.fork() 
     if pid > 0: 
      sys.exit(0) # Exit first parent. 
    except OSError, e: 
     sys.stderr.write("fork #1 failed: (%d) %sn" % (e.errno, e.strerror)) 
     sys.exit(1) 
    # Decouple from parent environment. 
    os.chdir("/") 
    os.umask(0) 
    os.setsid() 
    # Perform second fork. 
    try: 
     pid = os.fork() 
     if pid > 0: 
      sys.exit(0) # Exit second parent. 
    except OSError, e: 
     sys.stderr.write("fork #2 failed: (%d) %sn" % (e.errno, e.strerror)) 
     sys.exit(1) 
    # The process is now daemonized, redirect standard file descriptors. 
    for f in sys.stdout, sys.stderr: f.flush() 
    si = file(stdin, 'r') 
    so = file(stdout, 'a+') 
    se = file(stderr, 'a+', 0) 
    os.dup2(si.fileno(), sys.stdin.fileno()) 
    os.dup2(so.fileno(), sys.stdout.fileno()) 
    os.dup2(se.fileno(), sys.stderr.fileno()) 

अपनी स्क्रिप्ट में, आप बस होगा:

from daemonize import daemonize 
daemonize() 

और तुम भी stdio रीडायरेक्ट करने के लिए स्थानों निर्दिष्ट कर सकते हैं , गलती, आदि ...

+4

इस के शुरुआती निर्माण की तरह दिखता है: http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/ –

3

आप जो पूछ रहे हैं उसके लिए चांदी की गोली नहीं है, लेकिन supervisord देखें।यह प्रबंधन प्रक्रियाओं के सभी मजेदार बिट्स को संभालता है। मैं इसे बड़े उत्पादन वातावरण में भारी मात्रा में उपयोग करता हूं। इसके अलावा, यह पायथन में लिखा है!

5

बेन फिननी के डेमन मॉड्यूल की जांच करें। उन्होंने कहा कि एक पीईपी को लक्षित अजगर 3.X लिखने के लिए शुरू हो गया है:

http://www.python.org/dev/peps/pep-3143/

लेकिन एक कार्यान्वयन यहाँ पहले से ही उपलब्ध है:

http://pypi.python.org/pypi/python-daemon/

0

यह blog entry मेरे लिए यह स्पष्ट कर दिया है कि वहाँ वास्तव में हैं कि आपके पायथन प्रोग्राम को एक डेमॉन के रूप में चलाने के दो सामान्य तरीके (मुझे यह नहीं पता था कि मौजूदा उत्तरों से इतना स्पष्ट रूप से बाहर निकाला गया है):

पाइथन में सर्वर जैसे डेमॉन अनुप्रयोगों को लिखने के दो दृष्टिकोण हैं।

  • पहले संभाल sarting के सभी कार्यों और अजगर कोड में ही में रोक डेमॉन है। ऐसा करने का सबसे आसान तरीका python-daemon पैकेज के साथ है जो अंततः पाइथन वितरण में अपना रास्ता बना सकता है।

Poeljapon's answer, इस 1 दृष्टिकोण का एक उदाहरण है, हालांकि यह python-daemon पैकेज का उपयोग नहीं है, लेकिन एक कस्टम के लिए लिंक लेकिन बहुत साफ अजगर स्क्रिप्ट।

  • अन्य दृष्टिकोण उपकरण ऑपरेटिंग सिस्टम द्वारा आपूर्ति का प्रयोग है। डेबैन के मामले में, इसका मतलब एक इनिट स्क्रिप्ट लिख रहा है जो start-stop-daemon प्रोग्राम का उपयोग करता है।

Ali Afshar's answerstart-stop-daemon का उपयोग कर 2 दृष्टिकोण का एक खोल स्क्रिप्ट उदाहरण है,।

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

0

गलत होने पर मुझे सही करें, लेकिन मेरा मानना ​​है कि सवाल यह है कि डिमन को कैसे हटाया जाए। अपने ऐप को पीआईपी के माध्यम से स्थापित करने के लिए सेट करें और फिर एंट्री_पॉइंट को cli(daemon()) बनाएं। फिर एक इनिट स्क्रिप्ट बनाएं जो आसानी से $app_name &

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