दिलचस्प पोस्ट
मल्टीपल जेफ्रैम्स का प्रयोग: अच्छा या बुरा अभ्यास? मैं एक एनपीएम पैकेज के पिछले संस्करण को कैसे स्थापित करूं? जावास्क्रिप्ट के साथ महीने में दिनों की संख्या निर्धारित करने का सबसे अच्छा तरीका क्या है? सभी ब्राउज़रों के लिए jQuery का उपयोग करने वाले स्थानीयस्टॉयर परिवर्तन ईवेंट को कैसे बाँध सकते हैं? आईओएस 6 फेसबुक पोस्टिंग प्रक्रिया "रिमोट_एप_आईडी संग्रहीत आईडी से मेल नहीं खाती" त्रुटि के साथ समाप्त हो जाती है ओपनएसएल मैक ओएस एक्स एल कैप्टन के नवीनतम संस्करण को कैसे स्थापित करें I स्ट्रिंग प्रारूप मुद्रा रिफ्लेक्टर के लिए ओपन सोर्स विकल्प? PHP में एक अनिवार्य समारोह क्या है? jQuery: स्थिति () और ऑफसेट () के बीच का अंतर सी पंक्ति से फ़ाइल लाइन पढ़ें HoloEverywhere आयात करने में त्रुटि एएसपीएनटीटी एमवीसी में डीडी / एमएम / याय प्रारूप में दिनांक समय मान प्रदर्शित करें क्यों PerThreadLifetimeManager इस उदाहरण में प्रयोग किया जाता है? संपादनटैच ब्लिंकिंग कर्सर अक्षम करें

लिनक्स सेवा / डेमन के रूप में पायथन स्क्रिप्ट

Hallo,

मैं एक अजगर स्क्रिप्ट को सेवा (डीमन) के रूप में (उबुंटू) लिनक्स पर जाने की कोशिश कर रहा हूं।

वेब पर ऐसे कई समाधान मौजूद हैं जैसे:

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

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

http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

हालांकि, जैसा कि मैं अपने पायथन स्क्रिप्ट को विशेष रूप से उबुंटू लिनक्स के साथ एकीकृत करना चाहता हूं मेरा समाधान एक init.d स्क्रिप्ट के साथ संयोजन है

#!/bin/bash WORK_DIR="/var/lib/foo" DAEMON="/usr/bin/python" ARGS="/opt/foo/linux_service.py" PIDFILE="/var/run/foo.pid" USER="foo" case "$1" in start) echo "Starting server" mkdir -p "$WORK_DIR" /sbin/start-stop-daemon --start --pidfile $PIDFILE \ --user $USER --group $USER \ -b --make-pidfile \ --chuid $USER \ --exec $DAEMON $ARGS ;; stop) echo "Stopping server" /sbin/start-stop-daemon --stop --pidfile $PIDFILE --verbose ;; *) echo "Usage: /etc/init.d/$USER {start|stop}" exit 1 ;; esac exit 0 

और अजगर में:

 import signal import time import multiprocessing stop_event = multiprocessing.Event() def stop(signum, frame): stop_event.set() signal.signal(signal.SIGTERM, stop) if __name__ == '__main__': while not stop_event.is_set(): time.sleep(3) 

मेरा प्रश्न यह है कि क्या यह दृष्टिकोण सही है क्या मुझे कोई अतिरिक्त सिग्नल संभालना है? क्या यह "अच्छी तरह से व्यवहार किया गया यूनिक्स डेमन प्रोसेस" होगा?

वेब के समाधान से एकत्रित समाधान "लिनक्स सेवा / डेमन के रूप में पायथन स्क्रिप्ट"

मान लें कि आपके डेमन में लगातार चलने का कोई तरीका है (कुछ इवेंट लूप, मुड़, जो भी हो), आप upstart का उपयोग करने की कोशिश कर सकते हैं।

यहाँ एक काल्पनिक पायथन सेवा के लिए एक उदाहरण upstart कॉन्फ़िग है:

 description "My service" author "Some Dude <blah@foo.com>" start on runlevel [234] stop on runlevel [0156] chdir /some/dir exec /some/dir/script.py respawn 

यदि आप इसे /etc/init में script.conf के रूप में सहेजते हैं, तो आप एक-बार समय-समय पर सरल बनाते हैं

 $ sudo initctl reload-configuration $ sudo start script 

आप इसे stop script साथ stop script सकते हैं उपरोक्त उपरिवेशन का कहना है कि क्या यह सेवा रिबूट पर शुरू होती है और अगर वह मर जाती है तो उसे पुन: प्रारंभ कर देना है।

संकेत हैंडलिंग के लिए – आपकी प्रक्रिया को स्वाभाविक रूप से SIGTERM जवाब देना चाहिए। डिफ़ॉल्ट रूप से इसे तब तक नियंत्रित किया जाना चाहिए जब तक आपने विशेष रूप से अपना संकेत हैंडलर स्थापित नहीं किया हो।

रोलोटन का जवाब अच्छा है यह एक प्रकाश शोधन है, सिर्फ इसलिए कि मैं एक टन का समय डिबगिंग बिताया है। और मुझे एक नया जवाब देने की आवश्यकता है, इसलिए मैं ठीक से प्रारूपित कर सकता हूं।

कुछ अन्य बिंदु जो मुझे हमेशा के लिए डिबग में ले गए:

  1. जब यह विफल रहता है, तो पहले /var/log/upstart/.log को चेक करें
  2. यदि आपकी स्क्रिप्ट Python- daemon के साथ एक डेमॉन लागू करती है, तो आप 'डेमॉन की अपेक्षा' का उपयोग नहीं करते हैं नहीं 'उम्मीद' काम करता है मुझे पता नहीं क्यों (अगर किसी को क्यों पता है – कृपया पोस्ट करें!)
  3. साथ ही, सुनिश्चित करें कि आप ऊपर हैं (चालू / चल रहे) सुनिश्चित करने के लिए "initctl स्थिति स्क्रिप्ट" जांचते रहें (और जब आप अपना कॉन्फ़ फ़ाइल अपडेट करते हैं तो एक पुनः लोड करते हैं)

यहां मेरा संस्करण है:

 description "My service" author "Some Dude <blah@foo.com>" env PYTHON_HOME=/<pathtovirtualenv> env PATH=$PYTHON_HOME:$PATH start on runlevel [2345] stop on runlevel [016] chdir <directory> # NO expect stanza if your script uses python-daemon exec $PYTHON_HOME/bin/python script.py # Only turn on respawn after you've debugged getting it to start and stop properly respawn