दिलचस्प पोस्ट
संवाद बंद घटना में हुक एएससीआईआई "इमेज" में "ऊर्ध्वाधर" रीगेक्स मिलान JQuery प्लगइन्स का उपयोग करना जो कि डीओएम को रिएक्शन कॉम्पोनेंट्स में बदलता है? कोई संसाधन नहीं मिला – थीम। ऐप कॉमपेट। हल्का। डार्क ऍक्शन बैंक Homebrew सूत्र के विशिष्ट संस्करण स्थापित करें? क्यों @ फ़ॉन्ट चेहरा woff फ़ाइलों पर एक 404 त्रुटि फेंक रहे हैं? आर में अनन्य रंग के साथ प्रत्येक पंक्ति को एकाधिक पंक्तियां (डेटा श्रृंखला) बनाएं ऑपरेटर के बीच LINQ चरित्र तारों की सरणी में विभाजित स्ट्रिंग सी # – प्रकार के प्रकारों को प्रकार तर्क के रूप में इस्तेमाल नहीं किया जा सकता एक इनपुट स्ट्रीम को एक आउटस्टस्टस्ट्रीम से कनेक्ट करना जावा स्ट्रिंग शाब्दिक पूल और स्ट्रिंग के संयोजन के बारे में एक भ्रम मैं .NET में एक कॉम्बो बॉक्स गैर-संपादन योग्य कैसे बना सकता हूं? Boost Regex में उपयोग के लिए एक स्ट्रिंग से बचने के लिए कैसे एक सही MySQL कनेक्शन स्ट्रिंग बनाने के लिए?

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

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